将二进制数据转换为String

时间:2012-02-04 19:55:51

标签: java unicode utf-8

如果我有一些二进制数据D我将它转换为字符串S.我希望将它转换回二进制我会得到D.但是这是错误的。

public class A {
    public static void main(String[] args) throws IOException {
        final byte[] bytes = new byte[]{-114, 104, -35};// In hex: 8E 68 DD
        System.out.println(bytes.length);               //prints 3
        System.out.println(new String(bytes, "UTF-8").getBytes("UTF-8").length); //prints 7
    }
}

为什么会这样?

3 个答案:

答案 0 :(得分:2)

在字节数组之间转换为String并再次返回不是一对一的映射操作。读取docs,String implmentation使用CharsetDecoder将传入的字节数组转换为unicode。输入字节数组中的第一个和最后一个字节不能映射到有效的unicode字符,因此用一些replacement string替换它。

答案 1 :(得分:1)

您转换为字符串的字节可能实际上并不构成有效字符串。如果java无法弄清楚每个字节的含义,它将尝试修复它们。这意味着当您转换回字节数组时,它将与您启动时不同。如果你尝试使用一组有效的字节,那么你应该会更成功。

答案 2 :(得分:0)

您的数据无法使用UTF-8编码解码为有效的Unicode字符。看看解码后的字符串。它由3个字符组成:0xFFFD0x00680xFFFD。第一个和最后一个是“ ” - Unicode replacement characters。我想你需要选择其他编码。即“CP866”生成有效字符串并转换回相同的数组。