繁体   English   中英

C sscanf MD5到整数不起作用

[英]C sscanf MD5 to integer not working

我有一个将字符串转换为MD5的函数:

if(snprintf(target, 7, "123456") == -1){
    errx(1, "snprintf");            
}

uint a[4];
char w[64] = {0};

strncpy(w, target, 56);

md5_prep(w);
md5_cpu((uint*)&w[0], &a[0], &a[1], &a[2], &a[3]);

printf("%llu %llu %llu %llu\n", a[0], a[1], a[2], a[3]);

此printf给我:

970722017 2874784329 1474320062 1049104370

我知道这是正确的,因为如果我将其转换为十六进制就可以了,如果我使用MD5哈希作为密码,请尝试这样做:

if(snprintf(g, 33, "e10adc3949ba59abbe56e057f20f883e") == -1){
    errx(1, "snprintf");            
}

uint a[4];

sscanf(&g[0], "%x", &a0]);
sscanf(&g[8], "%x", &a[1]); 
sscanf(&g[16], "%x", &a[2]);
sscanf(&g[24], "%x", &a[3]);

printf("%llu %llu %llu %llu\n", a[0], a[1], a[2], a[3]);

结果是:

4294967295 4294967295 4061104190 4061104190

两个printfs不应该相等吗?

我通过此线程的sscanf工具将此MD5转换为int转换: 将MD5结果转换为C中的整数

您的问题是字节顺序。 十六进制的970722017是39dc0ae1而不是e10adc39。 不同之处在于4个字节的顺序。 4字节整数可以具有最低有效字节在先或其他最高有效字节在前,这取决于您所运行的系统。

换句话说,与连续的字节字符串相比,您在4byte int中的字节排列是向后的。

根据您的操作,您的md5实际上是:39dc0ae1ab59ba4957e056de3e880ff2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM