繁体   English   中英

如何对两个C字符数组按位进行XOR?

[英]How can I bitwise XOR two C char arrays?

无法解决这个问题,我感到很傻,但是我迷路了。 我试图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;
}

我的输出是:

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

one^two: 

为什么xor数组不读取任何内容?

一旦处理了XOR,就将处理可能不是可打印ASCII字符的二进制字节。

当您对相同的字符进行XOR运算时,您将得到0。因此'P' ^ 'P'将为0。这是一个NUL字节,它终止了字符串。 如果您尝试使用printf()打印,您将一无所获。 printf()认为该字符串是终止的length-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异或的。

那么“ Plain” xor“ Plain” == 00000,分别是0是终止符char。 C字符串打印到终止符,这意味着它什么也不打印。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM