站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题byte[]转String问题。。求助大虾!!!!!在线等!

byte[]转String问题。。求助大虾!!!!!在线等!

摘要: byte[]转String问题。。求助大虾!!!!!在线等!


遇到一个很奇怪的问题
我的byte[]数组byte1内存储的数据为:45,116,20,-45,94,-92
我将字节转为String
String strResult = new String(byte1);
在获得新的byte[] byte2
byte[] byte2 = strResult.getBytes();
这时候打印byte2数据存储为45,116,20,-45,94,63


请教各位老大。。。。。帮忙解决阿。。在线等。马上加分.




Java 中的char 类型是16位,其范围是0~65536,没有负数的char, 前面那个-45之所以能正常显示,我认为是和后面的数组成一个字,再通过getByte()还原,也就是说只要你最后一个是负数且倒数第二个是正数的话在转变成String的时候这个字符由于无法识别就会变成'?'(63)...


怎么解决阿?base64?给个例子好吗?


Java从一个byte流中读取一个字符串时,将把平台相关的byte转变为平台无关的Unicode字符串。在输出时Java将把Unicode字符串转变为平台相关的byte流,如果某个Unicode字符在某个平台上不存在,将会输出一个´?´。

-_-!



byte[] byte1 = {45,116,20,-45,94,-92};
String strResult = new String(byte1);
byte[] byte2 = strResult.getBytes();

我试了,没有问题啊。


你为什么要转过来再转回去?


strResult = new String(byte1,encoding);
可能和encoding的设置有关...


String的核心是char[],所以你单个负数转化肯定不能识别而变成'?'(63)的,不清楚你为什么要这样做。
如过你仅仅是为了转化后正常,那你在byte1后加多一个负数,如-1,byte2还原后的数组去掉最后的数(63 或 -1)就可以了,虽然这种方式很搞笑...


我的数据是jni调用vc返回来的byte数组,是个加密方法,所以每一位都不能有错。上面那个是从vc拿到的。我需要把它转成字符串。但是一转就会出现上述情况


救命啊


为何要这样做

String 的 getbyte 方法如果没指定 encoding
是用系统默认的。
如果你是在中文系统下,就是 GBK。
这时虚拟机就将那些 bytes 看成是字符的 GBK 表示,
要寻找这些字对应的 UNICODE。。

GBK 是 DBMS 编码,
也就是,小于 0x80 的,这个 byte 就是一个字符,跟 ASCII 的意义相同;
>= 0x80 的,就将该byte跟下一个byte合起来,两个bytes表示一个字符。当然这里有较多细节,如并非所有的 2-bytes 都表示有意义的字符等等。

还有是某个标准规定,
如果转换过程中找不到对应字符的,就用 ? 代替。

现在看你的数据,
45,116,20,-45,94,-92 的 16进制表示是 2D 6A 14 D3 5E A4
按GBK表示,字符划分分别是
2D
6A
14
D3 5E (2-bytes)
A4 。。(这里没东西:()
很明显,最后一个不能找到正确的对应,就用 ? 代替
? = 0x3f = 63
所以。。。。。。

最好用其他方法,
如果实在不行,就指定 encoding 为 ISO-8859-1
如 new String(bytes, "ISO-8859-1")
getBytes(string, "ISO_8859-1")

OVER!!


楼上的好详细啊!


↑返回目录
前一篇: 关于成员方法NATIVE?
后一篇: 哪能找到优秀的JAVA源代码