stdin:十六进制值根据标准输入而改变

时间:2014-07-15 18:05:16

标签: c hex command-line-arguments stdin gnome-terminal

我正在创建一个散列程序,它接受一个文件或stdin,并在另一个文件中打印出散列,或者通过stdout输出到终端。我的问题是我得到了基于相同stdin的不同哈希值,因为参数的十六进制值发生了变化。

我的代码中发生这种情况的部分是:

    for (i = 3; i < argc; i++) {
        if (strcmp(argv[i], "-i") == 0 && argv[i+1] != NULL) {
            in = argv[i+1];
            in = strtok(in, " ");
    printf("arg \"%s\" hex: %02x\n", argv[i+1], argv[i+1]);
            inCheck = 1;
            i++;
        }
        else if (strcmp(argv[i], "-o") == 0 && argv[i+1] != NULL) {
            out = argv[i+1];
            i++;
        }
        else 
            printf("Unknown argument %s. Ignoring.\n", argv[i]);
    }

基本上我在这里检查命令行中“-i”后面的输入的十六进制值。当我进入时:

./executable hash -sha -i hello -o world我得到了输出arg "hello" hex: ce4a2823 当我进入时:

./executable hash -sha -i hello我得到了输出arg "hello" hex: 247f582c 当我进入时:

./executable hash -sha -o world -i hello我得到输出arg "hello" hex: 57e2f82c

所以我想知道为什么字符串的十六进制值不断变化?

1 个答案:

答案 0 :(得分:1)

您没有打印字符串&#34;的某些&#34;十六进制值,您正在打印字符串的地址。如果要打印字符串中第一个字符的十六进制值,可以执行以下操作:

printf("arg \"%s\" hex: %02x\n", argv[i+1], argv[i+1][0]);

十六进制值可能不同,因为您的操作系统会在每次运行程序时随机化堆栈的位置,以便使缓冲区溢出/欠载错误漏洞更加困难。并且argv[]字符串可以存储在堆栈中(没有检查,我认为它们必须是可修改的,并且它们的长度当然不是静态的,所以在程序启动时将它们放到堆栈中是一个自然的解决方案)。


由于你谈到&#34;字符串&#34;的十六进制值,注意:C字符串基本上只是一段内存(例如char数组)的地址,包含一个或多个{ {1}}:字符串的字符,以及终止char字节的字符串(即使字符串为空也必须存在)。与大多数其他语言的字符串类型相比,它是一个非常原始的东西。