【问题标题】:MD5 digest is truncated when represented as QStringMD5 摘要在表示为 QString 时被截断
【发布时间】:2016-07-01 08:22:08
【问题描述】:

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

MD5 message digest should be fixed length

MD5- Wikipedia

我的代码 sn-p

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 

我做错了吗?

【问题讨论】:

  • 查看此类内容的最佳方式是库代码是正确的,而且明武是在使用它的方式。

标签: c++ qt md5


【解决方案1】:

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

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

我不使用 Qt,但快速搜索会发现类似这样的内容可以满足您的需求:

QString digest2(output.toHex()));

您应该始终确保(尤其是在处理诸如 C++ 之类的语言时)您完全了解幕后实际发生的事情,在这种特殊情况下,您的所有操作的实际底层数据类型是什么。一切都只是内存中的字节,而 C++ 让您能够随心所欲地“读取”这些字节——即使它还没有准备好或没有准备好。

【讨论】:

  • @stackOverflow 此外,根据打印功能,某些字节可能不会打印,并且让您认为输出比您尝试将 8 位数据字节视为字符串字符时更短。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-26
  • 2013-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多