我想为某些字符串打印MD5。为此我完成了函数
std::string generateHashMD5(std::string text)
{
unsigned char * resultHash;
resultHash = MD5((const unsigned char*)text.c_str(), text.size(), NULL);
std::string result;
result += (char *) resultHash;
return result;
}
Mow我想打印这个功能的结果。我尝试版本的这种功能。
void printHash(std::string hash)
{
for (unsigned i = 0; i < str.size(); i++)
{
int val = (short) hash[i];
std::cout<<std::hex<<val<<':';
}
std::cout<<std::endl;
}
std::string printHash(std::string hash)
{
char arrayResult[200];
for(int i = 0; i < 16; i++)
sprintf(&arrayResult[i*2], "%02x", (unsigned short int)hash[i]);
std::string result;
result += arrayResult;
return result;
}
问题是遗憾的是,没有一个没有显示正确的结果。该功能应该改变什么或错误在哪里?
答案 0 :(得分:1)
您不正当地使用std::string
作为缓冲区:
result += (char *) resultHash;
将resultHash视为一个c字符串,因此如果中间有\ 0字节,则无法获得足够的数据。如果没有\ 0字节,则会复制太多并获得UB。你应该使用大小为的构造函数:
std::string result( static_cast<const char *>( resultHash ), blocksize );
其中块大小可能是16.但我建议使用std::array<uint8_t,blocksize>
或std::vector<uint8_t>
代替os std::string
,因为std::string
缓冲区非常混乱。
答案 1 :(得分:0)
如果MD5返回字节数组
result += (char *) resultHash;
return result;
转换为字符串将在0之后丢失数字,因为字符串构造函数将输入解释为以null结尾的字符串 因此可以使用向量或具有明确字符数的字符串构造。
尽管如此,还没有足够的信息可以准确地说出