黑马程序员技术交流社区

标题: 奇怪的byte问题 [打印本页]

作者: 周磊    时间: 2012-10-17 23:10
标题: 奇怪的byte问题
public static void main(String[] args) {
                byte[] n = {-20,20,-10,20,-100};
                String s = new String(n);
                n = s.getBytes();
                for(byte i:n){
                        System.out.print(i+" ");
                }
        }       
以上代码输出的结果为63 63 63,为什么先把byte数组生在String,再把String变成byte他们就完全变样了,而且出来的是一个奇怪的值63,也就是问号,而原byte数组中没有出现出63这个值,这个63又从那儿来的?耐用5位的数组,为什么又变成了3位?
作者: 占琳    时间: 2012-10-17 23:14
数据类型转换,高位的能往低位的转换,如果是低位的数据类型往高位转会丢失精度,即丢失部分数据,byte的数据类型比String 小,在强制转换后 丢失了部分数据
作者: 周磊    时间: 2012-10-17 23:19
w129160 发表于 2012-10-17 23:14
数据类型转换,高位的能往低位的转换,如果是低位的数据类型往高位转会丢失精度,即丢失部分数据,byte的数 ...

String不是基本类型,不能向他转换的,这是String的构造函数,用Byte查找相应的码表,很显然,我故意给出的Byte在码表里面是没有的,那么那个63又是怎么出来的?
作者: 刘伟平    时间: 2012-10-17 23:22
本帖最后由 刘伟平 于 2012-10-17 23:25 编辑

因为码表里面没有这个值,所以输出了?,然后在后面再次转回byte型的时候,就转换了?的ASCII码。
20并不代表能显示的字符,所以没有转换为String
作者: 占琳    时间: 2012-10-17 23:41
周磊 发表于 2012-10-17 23:19
String不是基本类型,不能向他转换的,这是String的构造函数,用Byte查找相应的码表,很显然,我故意给出 ...

把一个String转化一个byte[]的时候,要指定编码方式!也就是说使用的是s.getBytes()方法!
这个方法是以系统的默认编码,来进行这个转换操作。而在不同的计算机上,这个值可能被设置为不同。
在s中提取的默认8859-1格式的字节数组长度为9,中文字符都变成了“63”,ASCII码为63的是“?”,一些国外的程序在国内中文环境下运行时, 经常出现乱码,上面布满了“?”,就是因为编码没有进行正确处理的结果。
并不是说值是63了。如果插入的字符串中带中文,比如你好 他们输出的GBK编码分别是:“c4e3”“bac3”
作者: 周磊    时间: 2012-10-18 12:21
自己顶一下




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2