public class hello {        /**
         * @param args
         */
        public static void main(String[] args) 
        {  byte[]b=new byte[]{1,2,3};
        
           
         
        
     String str=new String(b,0,2);
     
     System.out.println(str);
              
      }
                        }
怎么打印出两个口口而不是123啊
该怎么解决啊!
并说明理由如果byte[]b=new byte[]{1,2,3}改为byte[]b=new byte[]{'1','2','3'};怎么就打印出来了!
别人说什么你这是拿数字转字符~,还有byte 数组转换字符串就是这样的~字符编码的问题  
我一点也不明明白!请能给我讲清楚些吗?谢谢!转化过程是怎样的啊!编码什么什么的讲清楚些!谢谢了!!
谢谢了!!
谢谢了!!

解决方案 »

  1.   

    再给你换一下吧public class hello {  /** 
     * @param args 
     */ 
    public static void main(String[] args) 
    {  byte[]b=new byte[]{49,50,51}; 
    String str=new String(b,0,2);  System.out.println(str);  } 
    } 看看
    '1'-->49
    '2'-->50
    '3'-->51是否想起了些什么?
      

  2.   

    看看Asc码表就知道了
    Asc码表的前面几个是非打印字符
      

  3.   

    byte[]b=new byte[]{'1','2','3'}; 
                 
        String str=new String(b,0,2); 
        
        System.out.println(str); 
      

  4.   

    说白了,你这句:byte[]b=new byte[]{1,2,3},实际上往b里存的是ASCII码为1、2、3的3个字符,而不是数字1、2、3,而ASCII码为1、2、3的字符打印不出来,控制台为了表示这里有字符不是空白的,所以打出方框来代替
      

  5.   

    靠,解释的已经很清楚了.就是Asc码.
      

  6.   

    public String(byte[] ascii,
                             int hibyte,
                             int offset,
                             int count)
    Deprecated. This method does not properly convert bytes into characters. 
      

  7.   

    public String(byte[] bytes,
                  int offset,
                  int length)
    Constructs a new String by decoding the specified subarray of bytes using the platform's default charset. The length of the new String is a function of the charset, and hence may not be equal to the length of the subarray. 
    Sorry! 9# is not correct.
      

  8.   

    4楼正解,
    楼主上网搜索一下ACSII码表,里面会有相应的值的。Java中字符是采用Unicode编码的,数字和字符的Unicode编码,与,ACSII编码是重合的。
    所以,如果只是数字和字母的问题,查ASCII码对照表,就可以搞定了。
    如果是中文,或者别的什么文,那就比较麻烦了。
      

  9.   

    注意ASCII码和数字之间的相互转化关系
      

  10.   

    我就是想问问这怎么和扯上关系了,我是菜鸟!请多多指教!!byte[] 数组里输入的都必须转化为ASCII码吗?
    还是....?讲清楚些,想知道转化原理.谢谢了!!
      

  11.   

    我就是想问问这怎么和ACSII码扯上关系了,我是菜鸟!请多多指教!!byte[] 数组里输入的都必须转化为ASCII码吗?
    还是....?讲清楚些,想知道转化原理.谢谢了!!
      

  12.   

    不是必须转化为ASCII码,而是你这样写byte[]b=new byte[]{1,2,3}的时候,由于1、2、3都没有引号,而标识符又不能是纯数字,所以会被当成ASCII码处理,如果你写成byte[]b=new byte[]{'1','2','3'},加上引号就是数字了。
      

  13.   

    不要使用String的这个构造方法,由于使用缺省字符集,可能带来一些问题。
      

  14.   

    byte[]b=new byte[]{1,2,3}; byte 字节 
    1,2,3 整型数字把整型数字附值给字节数组,数字被解析为ASCII码附值;
    当你转为字符串输出时,输出为ASCII码,上面有人说不能显示,可能是这个原因吧。
      

  15.   

    输出的不是ASCII码,输出还是ASCII码对应的字符,但是ASCII码为1、2、3的三个字符显示不出来而已,如果存进去的是'1'(有引号)或者49(就是'1'的ASCII码),那么就可以输出数字1了。
      

  16.   

    ASCII码为1、2、3的字符打印不出来??  why???
      

  17.   

    byte数组是不可能租整数的,自动会转换为ASCII码的
      

  18.   

    ASCII为1,2,3的字符不是可见字符,所以打出来的是方框啊
    而加了单引号就是自动类型转换为char类型的了,所以打印出来的是123
      

  19.   

    多学习一下 《Think in Java》
      

  20.   

    编码问题
    比较郁闷,因为,比较基础。我们都知道,计算机,只认识01的二进制数。(对于程序员,一般,会把01的二进制数,转换成十六进制数来相互沟通。
    因为,4位二进制数,刚好可以表示一位十六进制数,任何一位十六进制数也可以转换为4位二进制数。)
    那么,我们要处理字符的时候,怎么办?
    只有把所知的字符,用数字来表示。这就是编码过程。早期的英文字符编码,流行的有3种,最为常用的就是ASCII编码,好象叫做 美国标准信息交换代码,
    其实,就是一个数值和字符的对照表,给楼主个地址,可以去查查看http://www.96yx.com/tool/ASC2.htm
    这个对照表里面不仅有26个大小写的英文字符,也有一些特殊字符,还有0~9这十个数字字符(也就是说,这里面的数字,按字符处理),
    我们知道,这种编码规则,有一个特点,就是,每个字符,用一个字节就可以表示,并且,只用一个字节的7个比特就可以完全表示了。
    (最高位的比特不用,是为了以后让这种编码具有可扩充性,GBK就是基于ASCII编码扩充出来的)回到Java
    Java当中,所有的字符,都是以Unicode的形式,进行编码的。
    Unicode编码,也有个特点,就是,所有的编码字符,都占2个字节(ASCII码占一个字节),
    并且,如果把Unicode编码的数值,按从小到大进行排列的话,前128个编码字符,与ASCII编码相同。
    换句话说,就是,如果把Unicode编码当中,高位字节是0x00的,并且低位字节最高位bit为0的,字符拿出来,
    与ASCII表进行对比,如果把Unicode的高位字节去掉,就与ASCII编码相同了。回到程序
    楼主应该去看看Java程序的常量表示。
    普通的数字0~9(比如int i=1中的1),会被默认为int型数据。
    如果你想让计算机识别成字符型(char型)的常量,那么应该用单引号将数字引起来,表示一个字符(比如char j='1'中的'1' )
    如果你声明变量是这种情况byte a='1';那么,系统会把字符型数据'1'它的高位字节0x00舍弃,把低位字节的内容存放到a中,
    那么,a的数值应该是49,十六进制是0x31,ASCII编码后的字符应该是'1'。谈谈String
    String对象的构造器有很多种,其中,楼主所使用的String(byte[] bytes, int offset, int length)这个构造器,
    第一个参数,是待转换的字节数组。
    在构造String对象的时候,传入的这个字节数组,会被解码。具体采用哪种编码方式进行解码,API说明是按照默认的编码方式进行解码的。
    这个默认的编码方式,取决于你操作系统的设定,一般Windows中文版,都使用的是GBK。
    如果默认的编码方式,无法正确进行解码,会再次尝试ASCII编码方式进行解码。我使用的操作系统是Windows XP 中文版,并且,默认的字符编码是GBK,
    那么根据程序流程,会对第一个参数bytes用GBK进行解码,
    由于GBK是从ASCII编码基础上扩充出来的,所以,完全能够将ASCII形式的bytes数据进行解码。解码成Unicode形式存储在内存中。
    前面我回答楼主的回复,可能会误导楼主,在这里,郑重道歉。
    总的来讲,就是,输入参数,是ASCII编码形式的数据,我们按照GBK编码的形式进行解码,解码后的数据,其实是Unicode编码的数据。容易混乱的ASCII与GBK
    GBK对字符的编码,不是定长编码(Unicode是定长编码,就是说,所有的字符都是2个字节来表示),GBK对字符的编码,采用的是变长编码。
    具体分两种情况:
    1.对于ASCII表中存在的字符,采用ASCII编码(单字节)。
    2.对于中文汉字,以双字节来表示,并且,双字节的每个字节的最高位为1 
    那么在解码的过程中,先判断一个字节的最高位是否为1,不为1则按ASCII编码来处理;
    如果为1则看下一个字节的最高位是否为1,如果为1则将两个字节按GBK编码来处理;
    下一个字节最高位不为1,则说明不是GBK编码的数据,是无法进行解码的。明白了上述内容,我们就会知道:
    我们输入的参数是ASCII编码的数据,程序按系统默认的GBK进行解码,解码后的数据是以Unicode的编码形式存储在内存中的。
    由于GBK是在ASCII上扩充出来的,所以,可以按GBK的编码方式对ASCII编码的数据进行解码。
    由于Unicode编码中,高位字节是0x00,低位字节最高位为0的,128个字符与ASCII编码相同,
    所以,在Unicode编码的所有字符中,ASCII编码中出现的字符,其数值的大小,在Unicode和ASCII中是相同的。汗~~~
    一身汗~~!
      

  21.   

    上面的说的都很对啊.都很清楚了,就是在byte数组存放的是ascii码