2013-03-14 60 views
1

我使用維基百科的MD5的C代碼MD5轉化uint8_t爲字符串

int main(int argc, char **argv) { 

if (argc < 2) { 
    printf("usage: %s 'string'\n", argv[0]); 
    return 1; 
} 

char *msg = argv[1]; 
size_t len = strlen(msg); 

// benchmark 
int i; 
for (i = 0; i < 1000000; i++) { 
    md5(msg, len); 
} 

//var char digest[16] := h0 append h1 append h2 append h3 //(Output is in little-endian) 
uint8_t *p; 

// display result 

p=(uint8_t *)&h0; 
printf("%2.2x%2.2x%2.2x%2.2x", p[0], p[1], p[2], p[3], h0); 

p=(uint8_t *)&h1; 
printf("%2.2x%2.2x%2.2x%2.2x", p[0], p[1], p[2], p[3], h1); 

p=(uint8_t *)&h2; 
printf("%2.2x%2.2x%2.2x%2.2x", p[0], p[1], p[2], p[3], h2); 

p=(uint8_t *)&h3; 
printf("%2.2x%2.2x%2.2x%2.2x", p[0], p[1], p[2], p[3], h3); 
puts(""); 

return 0; 

}

這是code.I已經有一定的瞭解它是如何工作的,我需要改造將MD5的結果轉換爲字符串。 這可能嗎?

基本上我需要將p =(uint8_t *)&h0;中的每一個轉換爲char []並將它們連接,換言之,將整個MD5代碼放在一個char []中。這是正確的/可能的嗎?

我花了整整一天yestarday綁定找到這個和我得到的最好的是如何使用sprinft trasform unit32_t,它確實有效。但是對於unit8_t而言並非如此。

回答

2

每個8位數字應打印%02x

  • 主導0意味着數量將隨着前導零顯示
  • 2意味着寬度是兩個十六進制字符
  • x裝置打印以十六進制數。

所以一審是:

p = (uint8_t *) &h0; 
printf("%02x%02x%02x%02x", p[0], p[1], p[2], p[3]); 
+0

所以,如果我做的sprintf(緩衝區 「%02X%02X%02X%02X」,P),它的工作原理? – Alessandroempire 2013-03-14 12:24:26

+0

是的,它應該做的。 – 2013-03-14 12:26:03

+0

問題:緩衝區應該有多大,以便8位可以複製到它? – Alessandroempire 2013-03-14 12:30:17