2014-11-04 55 views
0

我碰到過這段代碼here這個C代碼片斷是什麼意思?

result = HMAC(EVP_md5(), key, 32, data, 28, NULL, NULL); 
    for (i = 0; i < result_len; i++) { 
    sprintf(&(res_hexstring[i * 2]), "%02x", result[i]); 
    } 

循環做了什麼?特別是&(res_hexstring[i * 2])是什麼意思?難道你不能像數組一樣迭代結果嗎?爲什麼它是一個整數?

+0

十六進制字符串字符的八位組表示爲'00'到'FF'。你一次可以做到這一點,但這樣做有什麼意義,*相當多的工作沒有收穫?你可以假設'res_hexstring'用在除了轉儲到控制檯之外的地方,否則是'sprintf'沒有意義,可以用'printf'來完成。 – WhozCraig 2014-11-04 03:01:43

+0

,爲什麼你不能使用printf? – w774 2014-11-04 03:01:51

回答

0

它散列結果轉換爲字符串:

例如,來自:

char result[2] = {0xa1, 0xb2}; 

char res_hexstring[4 + 1] = {'a', '1', 'b', '2', '\0'} 

i * 2因爲字節0xa1需要兩個字符出現在&res_hexstring[i * 2]表達式( 'a''1')以字符串表示。

的具有被可然後容易地顯示的字符串的優點:

printf("%s\n", res_hexstring); // display the hash result 
0
for (i = 0; i < result_len; i++) { 
    sprintf(&(res_hexstring[i * 2]), "%02x", result[i]); 
} 

sprintf打印從二進制數組result 1字節的結果< => 2半字節/在一個時間十六進制數字進入緩衝區res_hexstring

這是左邊索引每2個字節移動2個字節的原因。

當然,不使用sprintf會更快,但它也需要更多的代碼。
(這可能會導致一個更大或更小的二進制文件,而是必須,如果感興趣的測量。)

inline char to16digit(int x) { return x<10 ? '0'+x : 'A'-10+x; } 
for (i = 0; i < result_len; i++) { 
    res_hexstring[i*2] = to16digit(result[i]>>4); 
    res_hexstring[i*2+1] = to16digit(result[i]&15); 
} 
res_hexstring[2*result_len] = 0; 

有可能是您想它在人類可讀的形式種種原因,序列化,印刷和記錄其中突出。 (並且printf沒有以十六進制格式打印如此大的數字的格式。)

+0

那麼'結果'的形式是什麼?它被定義爲unsigned char * result;它是一個char還是一個十六進制值的數組?散列函數返回什麼? – w774 2014-11-04 03:21:17

+0

@ w774:'result'是長度爲'result_len'的二進制blob。 – Deduplicator 2014-11-04 03:25:39