XORing"Hello World!" 切断字符串

0x6*_*C74 19 c c++ xor

#include <stdio.h>
#include <string.h>

int main()
{
    char greeting[]="\nHello World!\n";
    int a;

    for(int i=0; i<strlen(greeting); i++)
        greeting[i]^=111;

    for(int i=0; i<strlen(greeting); i++)
        greeting[i]^=111;

    printf("%s\n",greeting);    
    scanf("%d",&a);

}
Run Code Online (Sandbox Code Playgroud)

输出:

Hell
Run Code Online (Sandbox Code Playgroud)

为什么在找到对应于XOR键编号的字母后切掉所有内容(在这种情况下,ASCII为'w')?在数理逻辑,N^N=00^N=N,不是吗?

zig*_*igg 56

因为'o'是ASCII码111,而带有111的XORing 111产生0 NUL,并且终止你的字符串.一旦发生这种情况(即使在第一个循环中,因为每次通过循环都会对其进行评估),strlen报告字符串会更短,并且循环停止.

在通过XOR之前保存字符串长度将使您免于此操作.

  • 注意,为了解决这个问题,他应该在变换字符串之前保存`strlen`的返回值. (6认同)
  • @NicolBolas他改变它然后取消突变,然后获得原始字符串,所以证明:http://ideone.com/omgw0 (3认同)
  • +1.请注意,xoring也影响第一个循环 - 它不会在'o'之后. (3认同)

das*_*ght 10

这是因为当你自己对一个数字进行xor时,它变为零,当strlen看到零时,它认为它是字符串的结尾.

如果在第一个循环之前将长度存储在变量中,然后在第二个循环中使用保存的长度而不是strlen,则程序将生成预期结果.