这个C代码片段是什么意思?

时间:2014-11-04 02:57:33

标签: c hash

我遇到过这段代码here

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])是什么意思?你不能只是作为一个数组迭代结果吗?为什么是整数?

2 个答案:

答案 0 :(得分:0)

它将哈希结果转换为字符串:

例如,来自:

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

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

表达式i * 2出现在&res_hexstring[i * 2]中,因为字节0xa1需要在字符串中表示两个字符('a''1')。

拥有字符串的优点是可以轻松显示:

printf("%s\n", res_hexstring);  // display the hash result

答案 1 :(得分:0)

for (i = 0; i < result_len; i++) {
    sprintf(&(res_hexstring[i * 2]), "%02x", result[i]);
}

sprintf打印二进制数组result的结果1字节&lt; =&gt; 2个半字节/十六进制数字一次进入缓冲区res_hexstring

左侧索引为每1个字节移动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没有格式以十六进制表示法打印这么大的数字。)