【问题标题】:How to generate md5 of file in Qt? [duplicate]如何在 Qt 中生成文件的 md5? [复制]
【发布时间】:2015-10-18 12:23:26
【问题描述】:

我有代码,它为字符串生成 md5。 现在我想为文件添加生成 md5。 它适用于 txt 文件(xml、html、txt 等),但是当我尝试使用二进制文件(zip、bin、apk 等)时,我看到了错误的结果。 如何正确读取 (char*) 中的 bin 文件以生成有效哈希?

我尝试使用 TextStream,但结果无效

QFile file(fileName);
file.open(QIODevice::ReadOnly);

QTextStream in(&file);
QString t = in.readAll();
file.close();

string res = md5(t.toStdString());

我还尝试使用 QByteArray,然后将 byteArray 转换为 char* 但它也不能正常工作。 我该如何解决?

【问题讨论】:

  • 永远不要将QStringQTextStream 用于二进制数据。它们用于 Unicode 文本,从众所周知的编码中的字节解码。尝试将它们用于二进制数据会很高兴地默默地搞砸。
  • 好的,但是我可以使用什么来做到这一点?
  • 您可能需要考虑 QCrytographicHash。 Qt 有内置的 md5 代。 doc.qt.io/qt-5/qcryptographichash.html

标签: c++ qt md5


【解决方案1】:

永远不要将 QStringQTextStream 用于二进制数据。它们用于 Unicode 文本,以众所周知的编码从字节解码。尝试将它们用于二进制数据会很高兴地默默地搞砸,因为QString 默认情况下会尝试使用某种编码来解释输入数据,将其转换为 UTF-16 存储,默默地跳过它无法理解的任何内容。

存储二进制数据的类是QByteArray,可以使用QFile::read()方法读取其中的整个文件。

QByteArray data;
{
    QFile file(fileName);
    file.open(QIODevice::ReadOnly);
    data.readAll();
}

string res = md5(std::string(data.begin(), data.end());

请注意,我使用基于范围的构造函数构建了 std::string,因为仅使用 std::string(data.data())(来自 C 字符串的构造函数)将在第一个嵌入的 NUL 处停止。

【讨论】:

  • 我尝试使用 QByteArray,但我也得到了错误的结果 :( 所以,我认为这是我的 md5 实现的问题。但是对于字符串和 txt 文件它可以工作
  • 让我们看看您的代码...如果您不按照我的做法进行操作,QByteArray 也会出错(例如,您没有使用基于范围的方法构建 std::string构造函数)。
  • 哦,抱歉,您的代码有效,谢谢)
猜你喜欢
  • 2015-02-08
  • 2021-11-02
  • 2011-07-26
  • 1970-01-01
  • 2014-02-03
  • 1970-01-01
  • 2012-10-20
  • 1970-01-01
相关资源
最近更新 更多