我将字节数组bytes
转换为String。但是在计算字符串中的字节时,我得不到正确答案。 bytes
的大小是125,但我得到129。
代码如下:
String s2= null;
try {
System.out.println(bytes.length); //This gives 125 as answer
s2 = new String(bytes,"UTF-8");
System.out.println(s2.getBytes("UTF-8").length); //But this gives 129 instead of 125
}
catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
上述代码有什么问题?
编辑:根据以下给出的答案,bytes
的编码格式错误。如果bytes
的初始化完成如下所示,那么如何将bytes
转换为没有的字符串
丢失(或获得)任何额外数据?
byte[] bytes=new byte[125];
for (int i = 0; i < 125; i++) {
bytes[bytes.length - i / 8 - 1] |= 1 << (i % 8);
}
更新:如果我在上面的代码中移除了移位操作,它会给出正确的输出。转移有什么问题?
答案 0 :(得分:2)
s2 = new String(bytes,"UTF-8");
可能会添加额外的字节,因为原始字符串不是UTF-8。
答案 1 :(得分:1)
在进一步调查我的代码后,我发现bytes
数组包含负值。如果byte array
包含负值,则使用UTF-8
编码会在结果字符串中添加额外字符。这就是为什么当我将这个字符串转换回byte array
时会引入额外的字符,从而增加byte array
长度。
使用编码方法ISO-8859-1
解决了我的问题。
谢谢大家的建议。
答案 2 :(得分:0)
如果bytes
中的数据实际上是UTF-8编码,那么您发布的代码应该工作。
它不起作用,bytes
中的数据是其他任何东西(除了可能是UTF-8兼容的编码,如ASCII)。
这是因为并非每个可能的字节序列都是有效的UTF-8序列。当遇到其中一个无效序列时,它将被替换为Unicode替换字符。将其转换回字节将不重现原始字节。
您似乎在这里有一个更深层次的问题:什么是bytes
,为什么要首先将其转换为String
?