我正在Windows 8 64位OS上开发Qt应用程序。我遇到了这种奇怪的情况,其中MD5消息摘要只有4个字符长(仅= 32位。)。除此特殊输入外,我得到16个字符(= 128位)的消息摘要字符串。
我的代码段
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)
难道我做错了什么?
您正在将128位二进制 MD5 解释为ASCII。如果只有一个字节(八位)的值为“ 0”,则在C ++上以ASCII表示,它被视为“字符串结尾”标记。
您需要以ASCII十六进制表示MD5,而不是尝试照原样读取ASCII。
我不做Qt,但是快速搜索会发现类似这样的内容将满足您的要求:
QString digest2(output.toHex()));
Run Code Online (Sandbox Code Playgroud)
您应该始终确保(尤其是在处理C ++之类的语言时)完全了解幕后的实际情况,并且在这种情况下,所有操作的实际底层数据类型是什么。一切都只是内存中的字节,而C ++使您能够根据需要随意“读取”这些字节-即使它还没有准备好或本来就打算。
| 归档时间: |
|
| 查看次数: |
162 次 |
| 最近记录: |