在Java中无法将String转换为字节数组,反之亦然

时间:2015-12-27 11:03:51

标签: java arrays string character-encoding

我正在尝试将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}

3 个答案:

答案 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转换为返回数组的字节数组的方法

我希望至少有一点帮助