byte[] array = new byte[] { 10, -56, 13, 31};
String temp = new String(array);
              for (int i = 0; i < temp.getBytes().length; i++)
                   System.out.println(temp.getBytes()[i]);这段代码byte数组里面的-56在转回来输出时结果不同多了几个数。
想问下它的转换机制是怎样的,为什么负数会不同。

解决方案 »

  1.   

    java中byte的取值范围是0到255。
      

  2.   

    没吧,我记得JAVA的是-128到127,C#的才是0到255
      

  3.   

    错误是在array转String是出错的
      

  4.   

    楼上byte的取值范围是-128 到 127 吧 - - StringBuffer buf = new StringBuffer();
            for(byte element : array){
             buf.append(String.valueOf(element));
            }
            System.out.println(buf);
      

  5.   

    这个问题 简单来说: 是因为编码而导致的.如果不简单的说的话,那么看下面:
    首先上String的构造函数的JDK文档:
    ----------------------------------
    public String(byte[] bytes)通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。新 String 的长度是字符集的函数,因此可能不等于 byte 数组的长度。 
    当给定 byte 在给定字符集中无效的情况下,此构造方法的行为没有指定。如果需要对解码过程进行更多控制,则应该使用 CharsetDecoder 类。 
    ----------------------------------
    不需要我解释什么,文档很详尽
    ----------------------------------
    再上.getBytes的方法JDK文档:
    public byte[] getBytes()使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。 
    当此字符串不能使用默认的字符集编码时,此方法的行为没有指定。如果需要对编码过程进行更多控制,则应该使用 CharsetEncoder 类。 
    ----------------------------------
    也同样不需要说什么.最后,我把你的代码分拆成了几个步骤. 见下:
        byte[] array = new byte[] { 10, -56, 13, 31};
    String temp = new String(array); //
    byte[] newb = temp.getBytes(); //
    int count = newb.length;

    for (int i = 0; i < count; i++) {
    System.out.println(newb[i]);
    }
    总之就是负数很特殊, 当你把他丢进默认的String进行构造的时候他更特殊.当你还用默认的getbytes的时候他就更更特殊了. 特殊到最终输出可能是一个 多字节编码的字符. (虽然你当时输入的可能只是一个-56)无非就是因为 某些数值(1个byte)在某某编码下代表了   OOXX.  而某些编码下 OOXX 需要用多个byte来表示.
      

  6.   

    而10, 13,31 是有对应的 ASCII码的.  如下:
    0000 1010    10        0A            LF (NL line feed, new line)             换行键  
    0001 0011    19        13            DC3 (device control 3)                  设备控制3
    0001 1111    31        1F            US (unit separator)                     单元分隔符  
      

  7.   

    0000 1101    13        0D            CR (carriage return)                      回车键 发成19了..  这破ASCII表...擦...
      

  8.   


    给你一个推理:一个中文字符转换为byte字节是两个负数而你的byte数组中只有一个负数,一个负数不能完整的被解释为一个中文字符以及一个英文字符。。所以解释出来的temp字符串是带?号的乱码。
    进而可知如果你把byte数组中的-54前面或后面再加一个负数,就可以将其解释为一个中文字符。。那最后输出来的byte数据长度就和开始的array的长度一致了
      

  9.   

    还有,那个-56,我尝试了不管怎么变,当然是在-128到0之内的,都只会输出-17 -65 -67这三个。还有默认编码是UTF-8
      

  10.   


    try {
    String temp =new String( new byte[]{ 10, -56, 13, 31},"gbk");
    //如果你的java源文件是gbk编码,此时于String temp =new String( new byte[]{ 10, -56, 13, 31})
    System.out.println(temp);
    System.out.println(temp.length());
    temp =new String( new byte[]{ 10, -56, 13, 31},"utf-8");
    //如果你的java源文件是gbk编码,此时相当于temp =new String( new byte[]{ 10, -56, 13, 31})
    System.out.println(temp);
    System.out.println(temp.length());
    } catch (UnsupportedEncodingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }