问题描述
我正在使用XOR编码和解码消息:
class Search {
public static void main(String arg[]) {
String msg = "This is a test";
String encmsg = "";
String decmsg = "";
int key = 88;
System.out.print("Original message: ");
System.out.println(msg);
// encode the message.
for(int i=0; i < msg.length(); i++)
encmsg = encmsg + (char) (msg.charat(i) ^ key);
System.out.print("Encoded message: ");
System.out.println(encmsg);
// Decode the message.
for(int i=0; i < msg.length(); i++)
decmsg = decmsg + (char) (encmsg.charat(i) + key);
System.out.print("Decoded message: ");
System.out.println(decmsg);
}
}
如您所见,使用同一密钥的两个XOR的结果应产生已解码的消息。 一元补码(NOT)运算符反转操作数所有位的状态。我将把输出留给您:
Original message: This is a test
Encoded message: 01+x1+x9x,=+,Decoded message: dˆ‰ƒÐ‰ƒÐ‘Є•ƒ„
预期输出:
Original message: This is a test
Encoded message: 01+x1+x9x,Decoded message: This is a test
怎么了?问题可能与ASCII码有关
解决方法
您的解码代码块中可能有错字,您只需要更改
decmsg = decmsg + (char) (encmsg.charAt(i) + key);
到
decmsg = decmsg + (char) (encmsg.charAt(i) ^ key);
输出如下:
Original message: This is a test
Encoded message: 01+x1+x9x,=+,Decoded message: This is a test
顺便说一句,我们最好在{}
代码块中使用if
,以使我们的代码更易于阅读。
在解码时,+
运算符应替换为^
。
因为您使用exclusive or运算符进行编码。因此,您应该坚持使用该运算符进行解码。