2012-10-17 18 views
0

我有一個轉換字符串成MD5函數:Çsscanf的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都相等嗎?

我這個工具MD5通過的sscanf從這個線程詮釋轉換: Converting MD5 result into an integer in C

回答

1

您的問題是endian順序。十六進制中的970722017是39dc0ae1而不是e10adc39。不同的是4個字節的順序。一個4字節的整數可以先有最低有效字節,或者先有其他最重要字節,這取決於你所運行的系統。

換言之,與連續的字節字符串進行比較時,4字節int中的字節排列是反向的。

取決於你在做什麼,你的MD5居然是:39dc0ae1ab59ba4957e056de3e880ff2

+0

是的,你是對的,我手動解決了一些位轉移這個endian順序。 –