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在转回来输出时结果不同多了几个数。
想问下它的转换机制是怎样的,为什么负数会不同。
解决方案 »
- 出现Exception in thread "main" java.lang.NullPointerException求指教,急急急
- java问题,求教
- 30分求教一个需求的思路
- java路径问题
- 我用jbuilder做了个程序,并用jbuilder生成.exe形式,但运行后程序小图标是java虚拟机的销图标,如何换自己的?
- 关于“无布局管理器”的一个小问题
- 我想把JAVAC编译我的程序后把错误什么的输出到一个文本文件里,怎么做?
- 为什么下面代码不能识别汉字?(关于输入输出流)
- 怎么做出象边锋那样点一下桌子就坐下个小人的效果??
- 不同类中的main是否有用?
- 编写java小程序
- Java 四则运算表达式的分割
for(byte element : array){
buf.append(String.valueOf(element));
}
System.out.println(buf);
首先上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来表示.
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) 单元分隔符
给你一个推理:一个中文字符转换为byte字节是两个负数而你的byte数组中只有一个负数,一个负数不能完整的被解释为一个中文字符以及一个英文字符。。所以解释出来的temp字符串是带?号的乱码。
进而可知如果你把byte数组中的-54前面或后面再加一个负数,就可以将其解释为一个中文字符。。那最后输出来的byte数据长度就和开始的array的长度一致了
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();
}