A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周磊 中级黑马   /  2012-10-17 23:10  /  1515 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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位?

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 很给力!

查看全部评分

5 个回复

倒序浏览
数据类型转换,高位的能往低位的转换,如果是低位的数据类型往高位转会丢失精度,即丢失部分数据,byte的数据类型比String 小,在强制转换后 丢失了部分数据
回复 使用道具 举报
w129160 发表于 2012-10-17 23:14
数据类型转换,高位的能往低位的转换,如果是低位的数据类型往高位转会丢失精度,即丢失部分数据,byte的数 ...

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

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

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