将字符串转换为二进制并再次返回不会给出相同的字符串

Converting string to binary and back again does not give the same string

我正在编写一个简化的 DES 算法来加密并随后解密一个字符串。假设我有初始字符 (,它具有二进制值 00101000,我使用以下算法得到它:

public void getBinary() throws UnsupportedEncodingException {
    byte[] plaintextBinary = text.getBytes("UTF-8");
    for(byte b : plaintextBinary){
        int val = b;
        int[] tempBinRep = new int[8];
        for(int i = 0; i<8; i++){
            tempBinRep[i] = (val & 128) == 0 ? 0 : 1;
            val <<= 1;
        }

        binaryRepresentations.add(tempBinRep);
    }
}

在我执行各种排列和移位后,( 和它的二进制等价物被转换为 10001010 和它的 ASCII 等价物 Š。当我开始解密时,我通过 getBinary() 方法传递相同的字符,我现在得到二进制字符串 11000010 and another 二进制字符串 10001010 转换为 ASCII 为 x(

这个流氓x是从哪里来的?

编辑:完整的 class 可以在 here.

中找到

你没有提供解密代码,所以我们不能确定,但​​我猜你在填充字符串时错过了编码。 Java Strings 默认以 UTF-16 编码。由于您在加密时强制使用 UTF-8,我假设您在解密时也这样做。问题是,当您将加密的字节转换为字符串进行存储时,如果让它默认为 UTF-16,您可能会以两个字节的字符结尾,因为 10001010 是 138,超出了 127 的范围对于用单个字节表示的 ASCII 字符。

所以您得到的 "x" 是代码页的字节,后面是实际字符的字节。正如评论中所建议的那样,您最好将加密的字节存储为字节,并且在解密之前不要将它们转换为字符串。