我正在使用以下代码为字符串生成 MD5 散列。以十六进制打印的值似乎是正确的(我在网站上验证了相同的字符串)。但是,当我将该值打印为整数时,它有 36 位数字。我的理解是它应该有 16 位数字,因为生成的哈希值是 128 位长。
我想知道从 unsigned char 到 int 的转换应该如何完成,以及如何将其存储在变量中,以便最终将其打印到文件中。
如果有人能解释这些值是如何存储在 unsigned char 中的,比如需要多少位来表示十六进制和十进制的一位数字以及我如何在它们之间进行转换,那就太好了。我尝试了 sscanf 和 strtol,但我想我没有正确使用它们。
int main (void)
{
char *str = "tell";
u_int8_t *output; //unsigned char
output = malloc(16 * sizeof(char));
int i = 0;
MD5_CTX ctx;
MD5Init(&ctx);
MD5Update(&ctx, str, strlen(str));
MD5Final(output, &ctx);
while(i < 16)
printf("%x",output[i++]);
printf("\n");
i = 0;
while(i < 16)
printf("%i",output[i++]);
printf("\n");
}
这里的输出是
fe17ec3c451f132ef82a3a54e84a461e
254232366069311946248425884232747030
最佳答案
您正在打印每个字节的十进制值(254、23、236,...),而不是转换为 int 的单个 128 位值。你的循环应该看起来像 value <<= 8; value+=output[i++]
(前提是你的 value
是可以容纳这么大数字的类型)。
您对结果应有多少位数的预期也有偏差;除非你打印前导零,否则它的长度可以是 1 到 len(2**128-1) 之间的任何值,即 39 位十进制数字。
顺便说一下,您还应该对十六进制输出进行零填充,否则任何值低于 16 的字节都将打印一个十六进制数字 ( printf("%02x",...)
)。
关于c - 如何将 MD5 生成的十六进制值存储为整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9328337/