[英]Converting byte array to String and String to byte array in Java
我将字节数组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);
}
更新:如果我删除上面代码中的移位操作,它会给出正确的输出。 转移有什么问题?
s2 = new String(bytes,"UTF-8");
添加了额外的字节,因为原始字符串不是UTF-8。
在进一步调查我的代码后,我发现bytes
数组包含负值。 如果byte array
包含负值,则使用UTF-8
编码将在结果字符串中添加额外字符。 这就是为什么当我将这个字符串转换回byte array
会引入额外的字符,从而增加byte array
长度。
使用编码方法ISO-8859-1
解决了我的问题。
谢谢大家的建议。
如果以bytes
为bytes
的数据实际上是UTF-8编码的,那么您发布的代码应该可以工作 。
它不起作用,以bytes
为bytes
的数据是其他任何东西(除了可能是UTF-8兼容的编码,如ASCII)。
这是因为并非每个可能的字节序列都是有效的UTF-8序列。 当遇到其中一个无效序列时,它将被替换为Unicode替换字符。 将其转换回字节将不会重现原始字节。
你似乎在这里有一个更深层次的问题:什么是bytes
,为什么你想首先将它转换为String
?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.