ban*_*ara 3 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)));
Run Code Online (Sandbox Code Playgroud)
输出为:
130021000061f8f0001a
130021000061efbfbd
Run Code Online (Sandbox Code Playgroud)
完整的代码:
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)));
Run Code Online (Sandbox Code Playgroud)
这里的问题是这f8f0001a不是有效的UTF-8字节序列。
首先,f8起始字节表示一个5字节的序列,而您只有四个。其次,f8只能随后的一个字节8x,9x,ax或bx形式。
因此,它被替换为unicode replacement character (U+FFFD),其在UTF-8中的字节序列为efbfbd。
并且(正确地)不能保证无效字节序列与字符串之间的转换将导致相同的字节序列。(请注意,即使使用两个看似相同的字符串,您也可能会得到不同的字节,以Unicode表示它们,请参阅Unicode等价。)
这个故事的寓意是:如果要表示字节,则不要将它们转换为字符,如果要表示文本,则不要使用字节数组。
| 归档时间: |
|
| 查看次数: |
149 次 |
| 最近记录: |