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,我应该怎么办呢?这问题急需解决啊!!! 请帮帮忙想想~~~~
{
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,我应该怎么办呢?这问题急需解决啊!!! 请帮帮忙想想~~~~
String s = new String(b);不过ASC码里面好像没有-128,-64,-32
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};就可以看到正确的结果了。
在 bytecode 中,一个字符串常量是用 UCS2 编码方式进行存储的,所以每个字符永远占用两个字节。但是这一点对程序员来说可以不必关心。
“
没什么好奇怪的,结果很正常。原因:字符串的编码、解码过程不是完全可逆的。不同的编码方案都有数据转换时的盲区。
对于你举的例子来说,由于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]);
}
”
以上的代码,我试过,真的可以。对编码的认识是一定要有的,也是一个好的程序员应有的。
所以,我还很嫩,要认真的学习咯 :)