遇到一个很奇怪的问题
我的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
请教各位老大。。帮忙解决阿。。在线等。马上加分.

解决方案 »

  1.   

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

  2.   

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

  3.   

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

  4.   

    byte[] byte1 = {45,116,20,-45,94,-92};
    String strResult = new String(byte1);
    byte[] byte2 = strResult.getBytes();我试了,没有问题啊。
      

  5.   

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

  6.   

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

  7.   

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

  8.   

    为何要这样做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!!