表示为QString的MD5摘要被截断

sta*_*low 1 c++ qt md5

我正在Windows 8 64位OS上开发Qt应用程序。我遇到了这种奇怪的情况,其中MD5消息摘要只有4个字符长(仅= 32位。)。除此特殊输入外,我得到16个字符(= 128位)的消息摘要字符串。

MD5消息摘要应为固定长度

MD5-维基百科

我的代码段

qDebug()<<"Case 1:=> ";

message1="HYQPTPORKTWKJSVIVXHS1.130hello world!";
input.append(message1);
output=QCryptographicHash::hash(input,QCryptographicHash::Md5);
QString digest1(QString(output).toAscii());
qDebug()<<"md5  string: "<<digest1;
qDebug()<<"length :"<<digest1.length();

qDebug()<<"Case 2:=>";
input=""; // clears previous input
message2="HYQPTPORKTWKJSVIVXHS1.131hello world!";  // put anything else than message1
input.append(message2);
output=QCryptographicHash::hash(input,QCryptographicHash::Md5);
QString digest2(QString(output).toAscii());
qDebug()<<"md5  string: "<<digest2;
qDebug()<<"length :"<<digest2.length();
Run Code Online (Sandbox Code Playgroud)

输出量

 Case 1:=>  
md5  string:  ")QÄ" 
length : 4 // here I'm expecting 16
Case 2:=> 
md5  string:  "X,öéö< Ú4Îu" 
length : 16 
Run Code Online (Sandbox Code Playgroud)

难道我做错了什么?

Mah*_*dsi 5

您正在将128位二进制 MD5 解释为ASCII。如果只有一个字节(八位)的值为“ 0”,则在C ++上以ASCII表示,它被视为“字符串结尾”标记。

您需要以ASCII十六进制表示MD5,而不是尝试照原样读取ASCII。

我不做Qt,但是快速搜索会发现类似这样的内容将满足您的要求:

QString digest2(output.toHex()));
Run Code Online (Sandbox Code Playgroud)

您应该始终确保(尤其是在处理C ++之类的语言时)完全了解幕后的实际情况,并且在这种情况下,所有操作的实际底层数据类型是什么。一切都只是内存中的字节,而C ++使您能够根据需要随意“读取”这些字节-即使它还没有准备好或本来就打算。