我遇到过这段代码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])
是什么意思?你不能只是作为一个数组迭代结果吗?为什么是整数?
答案 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
没有格式以十六进制表示法打印这么大的数字。)