我有一个将字符串转换为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
我知道这是正确的,因为如果我把它转换为HEX就可以了,如果是密码我有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: Converting MD5 result into an integer in C
答案 0 :(得分:1)
您的问题是字节顺序。十六进制中的970722017是39dc0ae1而不是e10adc39。不同的是4个字节的顺序。 4字节整数可以首先具有最低有效字节,或者首先具有其他最高有效字节,这取决于您运行的系统。
换句话说,与顺序字节串相比,4字节int中的字节排列是向后的。
根据你在做什么,你的md5实际上是:39dc0ae1ab59ba4957e056de3e880ff2