2016-03-15 57 views
0

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

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 

难道I D出错了吗?

+0

最好的方式来看待这样的事情是库代码是正确的,并且meitake是在使用它的方式。 – zaph

回答

4

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

您需要将ASCII码中的MD5表示为十六进制数字,而不是尝试按ASCII原样读取它。

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

QString digest2(output.toHex())); 

你应该始终确保(尤其是像C++语言进行交往时),你是完全了解底层实际发生了什么,在这种特殊情况下,所有操作的实际底层数据类型是什么。一切都只是内存中的字节,而C++让你能够“随意”阅读这些字节 - 即使它没有准备好或者没有准备好。

+0

@stackOverflow同样取决于打印功能,某些字节可能无法打印,并且使您认为输出比如果您试图将8位数据字节视为字符串字符时短。 – zaph