如何按位异或两个 C char 数组?
How can I bitwise XOR two C char arrays?
我为无法解决这个问题而感到愚蠢,但我迷路了。我正在尝试对两个 C 字符串进行异或运算。
#include <stdio.h>
#include <memory.h>
#include <stdlib.h>
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 数组没有读取任何内容?
嗯"Plain" xor "Plain" == 00000,were 0是终止符char。 C 字符串打印到终止符,这意味着它不打印任何内容。
处理 XOR 后,您处理的是可能不是可打印 ASCII 字符的二进制字节。
当你对相同的字符进行异或时,你会得到一个 0。所以 'P' ^ 'P'
将是 0。这是一个 NUL 字节,它终止了字符串。如果您尝试使用 printf()
进行打印,您将一无所获; printf()
认为该字符串是长度为 0 的终止字符串。
此外,您应该使用 =
将 XOR 结果简单地分配到您的目标缓冲区,而不是像您的程序那样使用 ^=
。
这是我的程序版本和输出:
#include <stdio.h>
#include <memory.h>
#include <stdlib.h>
#define LENGTH 16
int main()
{
char const plainone[LENGTH] = "PlainOne";
char const plaintwo[LENGTH] = "PlainTwo";
char xor[LENGTH];
int i;
for(i=0; i<LENGTH; ++i)
xor[i] = (char)(plainone[i] ^ plaintwo[i]);
printf("PlainText One: %s\nPlainText Two: %s\n\none^two: ", plainone, plaintwo);
for(i=0; i<LENGTH; ++i)
printf("%02X ", xor[i]);
printf("\n");
return 0;
}
输出:
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
.
异或
我为无法解决这个问题而感到愚蠢,但我迷路了。我正在尝试对两个 C 字符串进行异或运算。
#include <stdio.h>
#include <memory.h>
#include <stdlib.h>
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 数组没有读取任何内容?
嗯"Plain" xor "Plain" == 00000,were 0是终止符char。 C 字符串打印到终止符,这意味着它不打印任何内容。
处理 XOR 后,您处理的是可能不是可打印 ASCII 字符的二进制字节。
当你对相同的字符进行异或时,你会得到一个 0。所以 'P' ^ 'P'
将是 0。这是一个 NUL 字节,它终止了字符串。如果您尝试使用 printf()
进行打印,您将一无所获; printf()
认为该字符串是长度为 0 的终止字符串。
此外,您应该使用 =
将 XOR 结果简单地分配到您的目标缓冲区,而不是像您的程序那样使用 ^=
。
这是我的程序版本和输出:
#include <stdio.h>
#include <memory.h>
#include <stdlib.h>
#define LENGTH 16
int main()
{
char const plainone[LENGTH] = "PlainOne";
char const plaintwo[LENGTH] = "PlainTwo";
char xor[LENGTH];
int i;
for(i=0; i<LENGTH; ++i)
xor[i] = (char)(plainone[i] ^ plaintwo[i]);
printf("PlainText One: %s\nPlainText Two: %s\n\none^two: ", plainone, plaintwo);
for(i=0; i<LENGTH; ++i)
printf("%02X ", xor[i]);
printf("\n");
return 0;
}
输出:
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
.