繁体   English   中英

在Java中将字节数组转换为String和String转换为字节数组

[英]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解决了我的问题。

谢谢大家的建议。

如果以bytesbytes的数据实际上是UTF-8编码的,那么您发布的代码应该可以工作

它不起作用,以bytesbytes的数据是其他任何东西(除了可能是UTF-8兼容的编码,如ASCII)。

这是因为并非每个可能的字节序列都是有效的UTF-8序列。 当遇到其中一个无效序列时,它将被替换为Unicode替换字符。 将其转换回字节将不会重现原始字节。

你似乎在这里有一个更深层次的问题:什么是bytes ,为什么你想首先将它转换为String

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM