我正在创建一个散列程序,它接受一个文件或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
所以我想知道为什么字符串的十六进制值不断变化?
答案 0 :(得分:1)
您没有打印字符串&#34;的某些&#34;十六进制值,您正在打印字符串的地址。如果要打印字符串中第一个字符的十六进制值,可以执行以下操作:
printf("arg \"%s\" hex: %02x\n", argv[i+1], argv[i+1][0]);
十六进制值可能不同,因为您的操作系统会在每次运行程序时随机化堆栈的位置,以便使缓冲区溢出/欠载错误漏洞更加困难。并且argv[]
字符串可以存储在堆栈中(没有检查,我认为它们必须是可修改的,并且它们的长度当然不是静态的,所以在程序启动时将它们放到堆栈中是一个自然的解决方案)。
由于你谈到&#34;字符串&#34;的十六进制值,注意:C字符串基本上只是一段内存(例如char
数组)的地址,包含一个或多个{ {1}}:字符串的字符,以及终止char
字节的字符串(即使字符串为空也必须存在)。与大多数其他语言的字符串类型相比,它是一个非常原始的东西。