我如何按位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因为PlainPlain是XORed。

好“普通”xor“普通”== 00000,0是终结者字符。 C字符串打印到终止符,这意味着它什么都不打印。