将字符串转换为二进制并再次返回不会给出相同的字符串
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" 是代码页的字节,后面是实际字符的字节。正如评论中所建议的那样,您最好将加密的字节存储为字节,并且在解密之前不要将它们转换为字符串。
我正在编写一个简化的 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" 是代码页的字节,后面是实际字符的字节。正如评论中所建议的那样,您最好将加密的字节存储为字节,并且在解密之前不要将它们转换为字符串。