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

C++ 如何在Qt中生成文件的md5?,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.readAl

我有代码,它为字符串生成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* 但它也不能正常工作。 如何修复它?

永远不要将
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时停止。

永远不要将
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时停止。

永远不要对二进制数据使用
QString
QTextStream
。它们用于Unicode文本,以众所周知的编码方式从字节解码。试着把它们用在二进制数据上,会愉快地、默默地把它拧起来。好吧,但是我能用什么来做呢?你可能想考虑QutotoGigiFasH。Qt内置了md5代。切勿对二进制数据使用
QString
QTextStream
。它们用于Unicode文本,以众所周知的编码方式从字节解码。试着把它们用在二进制数据上,会愉快地、默默地把它拧起来。好吧,但是我能用什么来做呢?你可能想考虑QutotoGigiFasH。Qt内置了md5代。我试图使用QByteArray,但我也得到了错误的结果:(因此,我认为这是我的md5实现的一个问题。但是对于字符串和txt文件,它可以工作,让我们看看你的代码……如果你不像我那样做(例如,你不使用基于范围的构造函数构建
std::string
),你也可能会在
QByteArray
中出错)。哦,对不起,你的代码可以工作,谢谢)我尝试使用QByteArray,但我也得到了错误的结果:(因此,我认为这是我的md5实现的问题。但是对于字符串和txt文件,它可以工作。让我们看看你的代码…如果你不像我那样做,你也可以用QByteArray出错(例如,您没有使用基于范围的构造函数构建
std::string
)。哦,对不起,您的代码可以正常工作,谢谢)