当前页面: 开发资料首页 → 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!!
楼上的好详细啊!