[英]Java String to byteArray conversion issue
我正在尝试将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)));
这里的问题是f8f0001a
不是有效的UTF-8字节序列。
首先, f8
开放字节表示一个5字节的序列,而你只有四个。 其次, f8
后面只能跟一个8x
, 9x
, ax
或bx
格式的字节。
因此它被替换为unicode replacement character (U+FFFD)
,其UTF-8中的字节序列是efbfbd
。
并且(正确地)不能保证将无效字节序列转换为字符串和从字符串转换将导致相同的字节序列。 (请注意,即使有两个看似相同的字符串,您可能会在Unicode中获得表示它们的不同字节,请参阅Unicode等效 。)
故事的寓意是:如果要表示字节,不要将它们转换为字符,如果要表示文本,请不要使用字节数组。
我的UTF-8有点生锈:-),但序列F8 F0
不是有效的utf-8编码。
从字节数组构建String
,将解码字节。
由于代码中的字节不代表有效字符,因此最终组成String
的字节与您作为参数传递的字节不同。
通过使用平台的默认字符集解码指定的字节数组构造一个新的
String
。 新String
的长度是字符集的函数,因此可能不等于字节数组的长度。未指定给定字节在默认字符集中无效时此构造函数的行为。 当需要更多地控制解码过程时,应该使用
CharsetDecoder
类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.