2016-03-15 12 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