我必须将字节数组转换为Android中的字符串,但我的字节数组包含负值。

如果我将该字符串再次转换为字节数组,我得到的值与原始字节数组值不同。

我该怎么做才能得到正确的转换?我用来做转换的代码如下:

// Code to convert byte arr to str:
byte[] by_original = {0,1,-2,3,-4,-5,6};
String str1 = new String(by_original);
System.out.println("str1 >> "+str1);

// Code to convert str to byte arr:
byte[] by_new = str1.getBytes();
for(int i=0;i<by_new.length;i++) 
System.out.println("by1["+i+"] >> "+str1);

我被这个问题难住了。


当前回答

虽然base64编码是安全的,有人可能会争论“正确的答案”,但我在这里寻找一种方法来将Java字节数组转换为Java字符串。也就是说,字节数组的每个成员在其对应的String中保持完整,不需要额外的空间用于编码/传输。

这个描述8位透明编码的答案对我很有帮助。我在二进制数据上使用ISO-8859-1来成功地来回转换(二进制<->字符串),而没有base64编码所需的膨胀空间要求,因此对我的用例YMMV是安全的。

这也有助于解释何时/是否应该进行实验。

其他回答

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;    

private static String base64Encode(byte[] bytes)
{
    return new BASE64Encoder().encode(bytes);
}

private static byte[] base64Decode(String s) throws IOException
{
    return new BASE64Decoder().decodeBuffer(s);
}

字符串是char's (16bit unsigned)的集合。所以如果你要把负数转换成字符串,它们会在转换中丢失。

尽管

new String(bytes, "UTF-8")

如果是正确的,它会抛出一个UnsupportedEncodingException,迫使你处理一个checked异常。你可以使用自Java 1.6以来的另一个构造函数来将字节数组转换为String:

new String(bytes, StandardCharsets.UTF_8)

这个函数不会抛出任何异常。

转换回也应该用StandardCharsets完成。UTF_8:

"test".getBytes(StandardCharsets.UTF_8)

同样,您可以避免处理受控异常。

datatypeconverter应该这样做:

byte [] b = javax.xml.bind.DatatypeConverter.parseHexBinary("E62DB");
String s = javax.xml.bind.DatatypeConverter.printHexBinary(b);

你可以使用简单的for循环进行转换:

public void byteArrToString(){
   byte[] b = {'a','b','$'};
   String str = ""; 
   for(int i=0; i<b.length; i++){
       char c = (char) b[i];
       str+=c;
   }
   System.out.println(str);
}