Java String到byteArray的转换问题

时间:2014-08-25 09:43:42

标签: java string bytearray

我正在尝试将ByteArray编码/解码为String,但输入/输出不匹配。我做错了吗?

System.out.println(org.apache.commons.codec.binary.Hex.encodeHexString(by));
String s = new String(by, Charsets.UTF_8);
System.out.println(org.apache.commons.codec.binary.Hex.encodeHexString(s.getBytes(Charsets.UTF_8)));

输出结果为:

130021000061f8f0001a
130021000061efbfbd

完整代码:

String[] arr = {"13", "00", "21", "00", "00", "61", "F8", "F0", "00", "1A"};        
byte[] by = new byte[arr.length];

for (int i = 0; i < arr.length; i++) {
    by[i] = (byte)(Integer.parseInt(arr[i],16) & 0xff); 
}

System.out.println(org.apache.commons.codec.binary.Hex.encodeHexString(by));

String s = new String(by, Charsets.UTF_8);
System.out.println(org.apache.commons.codec.binary.Hex.encodeHexString(s.getBytes(Charsets.UTF_8)));

3 个答案:

答案 0 :(得分:5)

这里的问题是f8f0001a不是有效的UTF-8字节序列。

首先,f8开放字节表示5字节序列,而您只有4字节。其次,f8后面只能跟一个8x9xaxbx格式的字节。

因此它被替换为unicode replacement character (U+FFFD),其UTF-8中的字节序列为efbfbd

并且(正确地)并不保证将无效字节序列转换为字符串和从字符串转换将导致相同的字节序列。 (请注意,即使有两个看似相同的字符串,您可能会在Unicode中获得表示它们的不同字节,请参阅Unicode equivalence。)

故事的寓意是:如果你想表示字节,不要将它们转换为字符,如果你想表示文本,不要使用字节数组。

答案 1 :(得分:3)

我的UTF-8有点生锈:-),但序列F8 F0不是有效的utf-8编码。

请看http://en.wikipedia.org/wiki/Utf-8#Description

答案 2 :(得分:2)

从字节数组构建String时,字节将被解码。

由于代码中的字节不代表有效字符,因此最终组成String的字节与您作为参数传递的字节不同。

  

public String(byte[] bytes)

     

通过解码构造一个新的String   使用平台的默认字符集指定的字节数组。该   新String的长度是字符集的函数,因此可能   不等于字节数组的长度。

     

这个行为   当给定字节在默认字符集中无效时的构造函数   没有具体说明。当更多时,应该使用CharsetDecoder类   需要控制解码过程。