c++ - 如何在Qt中生成文件的md5?

标签 c++ qt md5

<分区>

我有代码,可以为字符串生成 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 文本在众所周知的编码中。尝试将它们用于二进制数据会愉快而安静地把它搞砸,因为默认情况下 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 处停止。

关于c++ - 如何在Qt中生成文件的md5?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33197881/

相关文章:

c++ - Poco::AutoPtr 上的常量指针

c++ - qt+mysql交互问题

qt - 使用 Microsoft Enterprise WDK 设置 qtcreator

flutter - Flutter和Dart将字符串转换为md5,然后作为字符串调用

visual-studio-2012 - 我想用MD5 Class做一些加密工作,但是找不到?

C++/快速随机访问在大文件中跳过

c++ - 使用 LLVM API 生成静态代码

c++ - Qt 信号和槽通过引用传递

c# - 如何在C#中创建一个md5文件

c++ - 如何链接 netbeans (linux) 中的库?