我正在尝试将byte array
转换为String
。但转换改变了价值观。这意味着我无法从已转换的byte array
恢复String
。
byte[] array = {-64,-88,1,-2};
ByteArrayOutputStream out = new ByteArrayOutputStream();
out.write(array);
String result = out.toString("UTF-8");
byte[] array2 = result.getBytes("UTF-8");
// output of array2: {-17,-65,-67,-17}
答案 0 :(得分:4)
这是 charset 问题 - utf-8每个字符超过1个字节。尝试使用像
这样的1字节字符集String result = out.toString("ISO-8859-15");
byte[] array2 = result.getBytes("ISO-8859-15");
答案 1 :(得分:2)
你必须使用固定的单字节编码,就像Jan建议的那样。 UTF-8是一种非固定编码,这意味着,在某些情况下,您需要多于一个字节来编码单个代码点。这是其中一种情况,因为您使用负数。 (请参阅Wiki页面中有关utf-8)
的表格对我来说有趣的是,在将第二个数组转换为字符串后,字符串是相同的但是底层数组却没有。 但重点是,给定的字符不是合法的代码点(或者它的utf-8表示),在这种情况下,get代替了代码点65533,而代码点65533又需要3个字节来表示输出:< / p>
[-17, -65, -67, -17, -65, -67, 1, -17, -65, -67]
前两个代码点表示为-17,-65,-67,表示非法代码点。 1表示一个合法的代码点,因此它“幸存”了转换,然后最后再次成为非法的。
答案 2 :(得分:-1)
我相信你可以通过将数组传递给像
这样的构造函数来创建字节数组中的字符串 String test = new String(byte_array);
还有一种String将String转换为返回数组的字节数组的方法
我希望至少有一点帮助