我如何按位XOR两个C char数组?

Mat*_*ell 10 c arrays bit-manipulation char xor

我觉得愚蠢无法解决这个问题,但我迷失了.我试图XOR两个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;
}
Run Code Online (Sandbox Code Playgroud)

我的输出是:

$ ./a.out 
PlainText One: PlainOne
PlainText Two: PlainTwo

one^two: 
Run Code Online (Sandbox Code Playgroud)

为什么xor数组不能读作什么?

ste*_*eha 12

处理XOR后,您正在处理可能不是可打印ASCII字符的二进制字节.

当你对彼此的相同字符进行XOR时,你得到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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

PlainText One: PlainOne
PlainText Two: PlainTwo

one^two: 00 00 00 00 00 1B 19 0A 00 00 00 00 00 00 00 00
Run Code Online (Sandbox Code Playgroud)

注意前五个字节是如何全部00因为Plain与XOR一起Plain.