[英]Cannot convert String to byte array and vice versa in Java
我试图将byte array
转换为String
。 但转换改变了价值观。 这意味着我无法从转换后的String
恢复byte array
。
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}
这是一个字符集问题 - utf-8每个字符有超过1个字节。 尝试使用一些像1字节的字符集一样
String result = out.toString("ISO-8859-15");
byte[] array2 = result.getBytes("ISO-8859-15");
您必须使用固定的单字节编码,就像Jan建议的那样。 UTF-8是一种非固定编码,这意味着,在某些情况下,您需要多于一个字节来编码单个代码点。 这是其中一种情况,因为您使用负数。 (参见wiki页面中关于utf-8的表格)
对我来说有趣的是,在将第二个数组转换为字符串之后,字符串是相同的但是底层数组却没有。 但问题是,给定的字符不是合法的代码点(或者它的utf-8表示),在这种情况下,get代替了代码点65533,而代码点65533又需要3个字节来表示,这解释了输出:
[-17, -65, -67, -17, -65, -67, 1, -17, -65, -67]
前两个代码点表示为-17,-65,-67,表示非法代码点。 1表示一个合法的代码点,因此它“幸存”了转换,然后最后再次是非法的。
我相信你可以通过将数组传递给这样的构造函数来从字节数组中创建一个字符串
String test = new String(byte_array);
还有一种String将String转换为返回数组的字节数组的方法
我希望至少有一点帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.