2013-07-20 23 views
4

以下代码更改字符串的每个字节并创建一个新字符串。字符串toByte和反向,如果字节被修改,则不是双射

public static String convert(String s) { 
    byte[] bytes = s.getBytes(); 
    byte[] convert = new byte[bytes.length]; 

    for (int i = 0; i < bytes.length; i++) { 
     convert[i] = (byte) ~bytes[i]; 
    } 

    return new String(convert); 
} 

问题:为什么convert()不是双射的?

convert(convert("Test String")).equals("Test String") === false 
+0

一个'字符串'不只是一系列的任意字节。如果您想要将任意一系列的字节编码为文本,请使用Base64等。 –

回答

3

当你使用构造函数的字符串(字节[]),它不necesarily要多一个字母,它采用默认字符集;如果它是UTF-8,那么构造函数将尝试解码一两个或三个字节的字符,而不是一个字符。

由于您使用位补码来逐字节地进行转换,因此应用默认字符集时结果可能会有所不同。

如果您正在使用 ASCII字符,你可以试试这个版本的功能:因为当你转换的操纵字节字符串信息丢失和

// ONLY if you use ASCII as Charset 
public static String convert(String s) { 
    Charset ASCII = Charset.forName("ASCII"); 
    byte[] bytes = s.getBytes(ASCII); 
    byte[] convert = new byte[bytes.length]; 

    for (int i = 0; i < bytes.length; i++) { 
     convert[i] = (byte) (~bytes[i] & 0x7F); 
    } 

    return new String(convert, ASCII); 
} 
0

反之亦然 在下面这条线 for(int i = 0; i < bytes.length; i ++)convert [i] =(byte)bytes [i]; }

return new String(convert); 

如果你去字符串字节转换,反之亦然执行里面,你会发现,字符集和编码参与。 阅读关于它们,你会得到这种行为的详细解释。