1

我将字节数组转换bytes为字符串。但是在计算字符串中的字节时,我没有得到正确的答案。的大小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);
     }

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

4

3 回答 3

2

可能会s2 = new String(bytes,"UTF-8");添加额外的字节,因为原始字符串不是 UTF-8。

于 2013-10-28T18:12:10.487 回答
1

在进一步调查我的代码后,我发现该bytes数组包含负值。如果 abyte array包含负值,则使用UTF-8编码将在结果字符串中添加额外的字符。这就是为什么当我将这个字符串转换回byte array额外的字符时,会引入额外的字符,从而增加byte array长度。

使用编码方法ISO-8859-1解决了我的问题。

谢谢大家的建议。

于 2013-10-28T19:46:25.543 回答
0

您发布的代码应该可以工作,前提是其中的数据bytes实际上是 UTF-8 编码的。

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

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

您似乎在这里有一个更深层次的问题:首先是什么bytes以及为什么要将其转换为 a String

于 2013-10-28T18:20:29.610 回答