在C中打印按位XOR的结果

时间:2017-01-02 00:57:44

标签: c bit-manipulation xor

当我尝试对两个字符串进行按位XOR时,我得到x��K或类似的输出。我正在使用的代码:

char test[] = "teststring";
char test2[] = "testtwostring";
char *bytearray = NULL;
bytearray = malloc(sizeof(char) * (strlen(test2)+1));

for(int j=0; (j< strlen(test) && j< strlen(test2)); j++){
    bytearray[j] += test[j] ^ test2[j];
}

printf(bytearray)

如果不在每个bytearray元素中保存两个字符串的XOR结果,然后打印出新的结果字符串?有什么我想念的吗?

2 个答案:

答案 0 :(得分:4)

您的代码中存在许多问题:

  • bytearray[j] += test[j] ^ test2[j];修改bytearray,但它未初始化,因此根本不应读取其值,无论它们是什么都是不可预测的。这完全解释了您的观察结果。

  • 你没有null终止bytearray中的字符串,因此打印它会调用未定义的行为,因为它未初始化。

  • 直接传递printf字节数组。如果巧合,它包含一个%字符,那将调用未定义的行为,因为您没有将任何额外的参数传递给printf。你至少应该写printf("%s\n", bytearray);

  • bytearray中的值不一定是可打印的字符。

  • 在测试表达式中调用strlen(test)strlen(test2)的效率非常低,因为此操作很昂贵,并且在循环的每次迭代中都会重复执行。请改用此测试:

    for (j = 0; test[j] != '\0' && test2[j] != '\0'; j++) {
        ...
    

由于你的目标是保存两个字符串的XOR结果,你应该这样修改代码:

char test[] = "teststring";
char test2[] = "testtwostring";
size_t len = strlen(test);
size_t len2 = strlen(test2);
unsigned char *bytearray = malloc(len2 + 1);
size_t j;

for (j = 0; j < len && j < len2; j++) {
    bytearray[j] = test[j] ^ test2[j];
}
for (; j < len2; j++) {
    bytearray[j] = test2[j];
}

printf("XOR byte values: \n");
for (j = 0; j < len2; j++) {
    printf("%02X ", bytearray[j]);
}
printf("\n");

答案 1 :(得分:2)

您尚未初始化bytearray,因此它包含分配时在该内存部分中发生的任何垃圾。你想做的事:

memset(bytearray, 0, sizeof(char) * (strlen(test2) + 1));
使用malloc()分配数组后

。正如@John Bollinger所说,您可以通过调用malloc来合并memsetcalloc

bytearray = calloc(strlen(test2) + 1, sizeof(char));

作为另一种选择,您可以分配而不是添加:

bytearray[j] = test[j] ^ test2[j];

而不是:

bytearray[j] += test[j] ^ test2[j];

此外,您不应该反复调用strlen,因为该值永远不会改变。您应该为testtest2分别调用一次,将这些值存储在变量中,然后使用变量。现在strlen每次for循环迭代时都会被不必要地调用两次。