public class T 
{
public static void main(String[] args) 
{

byte[] b = new byte[]{-128, 0, -64, 0, -32, 0};
String s = new String(b);
byte[] c = s.getBytes();
for(int i = 0, j = b.length; i < j; i++){
System.out.println(b[i] + "\t" + c[i]);
}
}
}源码如上,结果如下-128    63
0       0
-64     63
0       0
-32     63
0       0
哪位可以告诉我,这转换到底发生了什么状况。
如果我一定要把这 byte串转为String,我应该怎么办呢?这问题急需解决啊!!!  请帮帮忙想想~~~~

解决方案 »

  1.   

    byte[] b = new byte[]{-128,-64,-32};
    String s = new String(b);不过ASC码里面好像没有-128,-64,-32
      

  2.   

    String(byte[] bytes) 
              Constructs a new String by decoding the specified array of bytes using the platform's default charset.
    要把byte里面的每个值都转换为字符值,你的-128, -64,-32根本就不是什么字符,字符都是正数,所以这三个都被?代替了,而?号的ascii码为63。
    如果把byte数组改为byte[] b = new byte[]{65, 0, 66, 0, 67, 0};就可以看到正确的结果了。
      

  3.   

    对!顶上!我刚才测试了确是如此!在程序员观点下,有字符和字节两个概念,但它们之间并没有直接的对应关系,只有在指定了一种特定的编码方式(比如   GB2312)后,才会有一定的对应关系。举例来说,一个中文字符,在   GB2312   的编码方式下对应两个字节,在   UTF-8   编码方式下对应三个字节,而在   UCS2   编码方式下对应两个字节;而对于标准   ASCII   字符来说,在   GB2312   和   UTF-8   编码方式下对应一个字节,在   UCS2   编码方式下对应两个字节。   
        
      在   bytecode   中,一个字符串常量是用   UCS2   编码方式进行存储的,所以每个字符永远占用两个字节。但是这一点对程序员来说可以不必关心。   
      

  4.   

    这个问题已经解决了,我在另外一个论坛上得到了答案,以下的是转载

    没什么好奇怪的,结果很正常。原因:字符串的编码、解码过程不是完全可逆的。不同的编码方案都有数据转换时的盲区。
    对于你举的例子来说,由于GBK编码只对连续的两个小于0的字节才识别为汉字,
    所以,类似-128,0这样的字节序列,对于GBK是不可识别的,转换后为字符'?',结果也就是63
    把-128换成其他的负数,结果也是一样的。要保持原字节的内容,要采用“ISO8859_1”。
    修改后的代码如下:byte[] b = new byte[] { -128, 0, -64, 0, -32, 0 };
    String s = new String(b,"ISO8859_1");
    byte[] c = s.getBytes("ISO8859_1");
    for (int i = 0, j = b.length; i < j; i++) {
            System.out.println(b[i] + "\t" + c[i]);


    以上的代码,我试过,真的可以。对编码的认识是一定要有的,也是一个好的程序员应有的。
    所以,我还很嫩,要认真的学习咯 :)