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

在Java中无法将字符串转换为字节数组,反之亦然,java,arrays,string,character-encoding,Java,Arrays,String,Character Encoding,我正在尝试将字节数组转换为字符串。但是转换会改变值。这意味着我无法从转换的字符串还原字节数组 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 arr

我正在尝试将
字节数组
转换为
字符串
。但是转换会改变值。这意味着我无法从转换的
字符串
还原
字节数组

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");

我相信您可以通过如下方式将数组传递给构造函数,从字节数组中创建字符串

String test=新字符串(字节数组)

还有一个String方法将字符串转换为返回数组的字节数组


我希望这至少对你有所帮助,你必须使用固定的单字节编码,就像简建议的那样。UTF-8是一种非固定编码,这意味着,在某些情况下,需要多个字节来编码单个代码点。这是一种情况,因为您使用负数。(请参见wiki页面中关于的表格)

我感兴趣的是,在将第二个数组转换为字符串后,字符串是相同的,但底层数组却不同。 但关键是,给定的字符不是合法的代码点(或它的utf-8表示形式),在这种情况下,字符将被替换为代码点65533,而代码点65533又需要表示3个字节,这解释了输出:

[-17, -65, -67, -17, -65, -67, 1, -17, -65, -67]

前两个代码点表示为-17、-65、-67,表示非法代码点。1代表一个合法的代码点,因此它“幸存”了转换,而最后一个又是非法的。

实际上,结果比您写的要长:
[-17,-65,-67,-17,-65,-67,1,-17,-65,-67]
。在javadoc中:
使用平台的默认字符集对指定的字节数组进行解码,从而构造一个新字符串。
。即使这样做有效,依靠它也是一个坏主意,因为它可能会在其他机器上产生不同的结果。