我有代码,为字符串生成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 * 但它也无法正常工作。 我该如何解决?
答案 0 :(得分:5)
永远不要将QString
和QTextStream
用于二进制数据。 它们用于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上。