当表示为QString时,MD5摘要被截断

时间:2016-03-15 18:13:29

标签: c++ qt md5

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

MD5 message digest should be fixed length

MD5- Wikipedia

我的代码段

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();

输出

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

我做错了吗?

1 个答案:

答案 0 :(得分:5)

您将128位二进制 MD5解释为ASCII。如果你有一个字节(8位),值为'0',则在C ++上的ASCII中,这被认为是“字符串结束”标记。

您需要在ASCII中将MD5表示为十六进制,而不是尝试以ASCII格式读取它。

我不做Qt,但快速搜索说这样的事情会做你想做的事情:

QString digest2(output.toHex()));

你应该始终确保(特别是在处理像C ++这样的语言时)你已经充分认识到实际发生的事情,在这种特殊情况下,你所有操作的实际底层数据类型是什么。一切都只是内存中的字节,而C ++使你能够“读取”那些字节,无论你想要什么 - 即使它还没有准备就绪或者意味着它。