我如何按位XOR两个C char数组?
我觉得愚蠢无法解决这个问题,但我迷失了。 我试图XOR两个C字符串。
#include #include #include int main() { char plainone[16]; char plaintwo[16]; char xor[17]; strcpy(plainone, "PlainOne"); strcpy(plaintwo, "PlainTwo"); int i=0; for(i=0; i<strlen(plainone);i++) xor[i] ^= (char)(plainone[i] ^ plaintwo[i]); printf("PlainText One: %s\nPlainText Two: %s\n\none^two: %s\n", plainone, plaintwo, xor); return 0; }
我的输出是:
$ ./a.out PlainText One: PlainOne PlainText Two: PlainTwo one^two:
为什么xor数组不能读作什么?
处理XOR后,您正在处理可能不是可打印ASCII字符的二进制字节。
当你将相同的字符相互异或时,你得到一个0.所以'P' ^ 'P'
将为0.这是一个NUL字节,它终止字符串。 如果你尝试用printf()
打印,你什么也得不到; printf()
认为该字符串是一个终止的长度为0的字符串。
此外,您应该使用=
而不是使用^=
将XOR结果分配到目标缓冲区中。
这是我的程序版本和输出:
#include #include #include #define LENGTH 16 int main() { char const plainone[LENGTH] = "PlainOne"; char const plaintwo[LENGTH] = "PlainTwo"; char xor[LENGTH]; int i; for(i=0; i
输出:
PlainText One: PlainOne PlainText Two: PlainTwo one^two: 00 00 00 00 00 1B 19 0A 00 00 00 00 00 00 00 00
注意前五个字节都是00
因为Plain
与Plain
是XORed。
好“普通”xor“普通”== 00000,0是终结者字符。 C字符串打印到终止符,这意味着它什么都不打印。