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

时间:2013-10-28 18:09:25

标签: 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);
     }

更新:如果我在上面的代码中移除了移位操作,它会给出正确的输出。转移有什么问题?

3 个答案:

答案 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