当前位置: 技术问答>java相关
String.getBytes的问题
来源: 互联网 发布时间:2015-09-28
本文导语: char a1=(int)10; char a2=(int)200; char a3=(int)23; StringBuffer sb = new StringBuffer(); sb.append(a1); sb.append(a2); sb.append(a3); try { out.write(sb.toString().getBytes()); out.flush(); } catch (Exception ex) { } out为OutputStream。 现在问...
char a1=(int)10;
char a2=(int)200;
char a3=(int)23;
StringBuffer sb = new StringBuffer();
sb.append(a1);
sb.append(a2);
sb.append(a3);
try {
out.write(sb.toString().getBytes());
out.flush();
} catch (Exception ex) {
}
out为OutputStream。
现在问题是:
我收到的消息中,长度根本不是3个字符长?收到的消息中,a1是对的,a3也是对的,可是a2却不知道变成什么了??有些时候可以变成有3个字符长了,真不明白为什么?sb.toString()之后,我查过还是没有问题的,所以我怀疑是getBytes()的问题,各位有没有什么好的意见?
char a2=(int)200;
char a3=(int)23;
StringBuffer sb = new StringBuffer();
sb.append(a1);
sb.append(a2);
sb.append(a3);
try {
out.write(sb.toString().getBytes());
out.flush();
} catch (Exception ex) {
}
out为OutputStream。
现在问题是:
我收到的消息中,长度根本不是3个字符长?收到的消息中,a1是对的,a3也是对的,可是a2却不知道变成什么了??有些时候可以变成有3个字符长了,真不明白为什么?sb.toString()之后,我查过还是没有问题的,所以我怀疑是getBytes()的问题,各位有没有什么好的意见?
|
Java里的char是16位的,也就是被吹得很神的Unicode,而byte是8位的,它才是相当于我们在C里了解的char。
String中的使用的是char,也就是16位的,在getBytes的时候,它的转化很有意思,如果是小于128,也就是16位的前8位为0,它就放到一个byte中,因为这么做不会造成任何精度损失,大于128的,如果采用同样的手段就会有问题,所以,放入两个byte中。你可以做一下实验。String的长度和getBytes出来byte数组长度实际上是不相等地。
这么做实际上是合理的,你可以想一下。如果我们做一个网络传输的例子,一边是Java程序,另一边是C程序,如果每个字节都转成2个byte的话,小于128的势必要被要有高字节为0,而在C程序里0代表着字符串截止,你的处理就会出现问题。
String中的使用的是char,也就是16位的,在getBytes的时候,它的转化很有意思,如果是小于128,也就是16位的前8位为0,它就放到一个byte中,因为这么做不会造成任何精度损失,大于128的,如果采用同样的手段就会有问题,所以,放入两个byte中。你可以做一下实验。String的长度和getBytes出来byte数组长度实际上是不相等地。
这么做实际上是合理的,你可以想一下。如果我们做一个网络传输的例子,一边是Java程序,另一边是C程序,如果每个字节都转成2个byte的话,小于128的势必要被要有高字节为0,而在C程序里0代表着字符串截止,你的处理就会出现问题。
|
byte是8位有符號整數,在-128~127之間
char是16位無符號整數,取值範圍為065535,作為字母數字它與高位置0的ASCII字符一樣
char是16位無符號整數,取值範圍為065535,作為字母數字它與高位置0的ASCII字符一樣
|
不懂,但建议你看看jdk的源码,也许有用