c – 为什么我的MD5值打印时带有额外的“f”字符?
作者:互联网
当使用std :: string的at()方法时,我有一个奇怪的问题.我想使用这个库计算给定字符串的md5哈希值:http://sourceforge.net/projects/libmd5-rfc/files/
哈希是正确计算的,但是以人为方式打印存在问题.输出是:
af04084897ebbf299b04082d105ab724
ffffffaf040848ffffff97ffffffebffffffbf29ffffff9b04082d105affffffb724
代码是:
#include <stdio.h>
#include<string>
#include<iostream>
extern "C" {
#include "md5.h"
}
int main()
{
md5_state_t state;
md5_byte_t digest[16];
std::string callid("f83bc385-26da-df11-95d5-0800275903dd@pc-archdev");
md5_init(&state);
md5_append(&state, (const md5_byte_t*)callid.c_str(), callid.length());
std::string callid_digest((const char*)digest, 16);
for(int i = 0; i < 16; ++i) {
printf("%02x", digest[i]);
}
printf("\n");
for(int i = 0; i < 16; ++i) {
const char c = callid_digest.at(i);
printf("%02x", c);
}
printf("\n");
}
“f”字符来自哪里?
解决方法:
您的字节值正在进行符号扩展.
当你将(签名)字符提升到更宽的类型并且设置了最高位时会发生这种情况,因为它试图保留符号(这就是为什么你只看到大于0x7f的值的额外f字符).使用unsigned char应该可以解决问题:
const unsigned char c = callid_digest.at(i); // may need to cast.
标签:c,md5,stdstring 来源: https://codeday.me/bug/20190726/1545115.html