我正在开发一个需要在两台机器,客户端和服务器之间进行FTP文件传输的项目。我想通过将客户端上生成的MD5校验和与服务器上生成的MD5校验和进行比较来验证传输后文件的完整性。我使用Qt的QCryptographicHash类编写了一个命令行程序来执行此操作。减去错误检查,这是完整的代码:
#include <QCoreApplication>
#include <QByteArray>
#include <QFile>
#include <QCryptographicHash>
#include <QTextStream>
#include <QStringList>
int main (int argc, char* argv[]) {
QCoreApplication app(argc, argv);
QTextStream cout(stdout, QIODevice::WriteOnly);
QStringList arglist = app.arguments();
QFile file(arglist.at(1));
if(!file.open(QIODevice::ReadOnly)){
/*error checking*/
}
QCryptographicHash cryptoHash(QCryptographicHash::Md5);
while(!file.atEnd()){
cryptoHash.addData(file.readLine());
}
QByteArray hashByteArray = cryptoHash.result();
cout << hashByteArray.toHex() <<endl;
file.close();
return 0;
}
在任何机器上,此代码将为任何输入文件提供可重复的MD5哈希。但是,在我的客户端上进行哈希处理时,为同一文件生成的哈希值与在服务器上进行哈希处理时的哈希值不同。我一直在与这个战斗,但似乎无法确定为什么这些哈希值不匹配。我最后的想法是它可能是与架构有关的问题,as discussed in this SO post。但是,在我的情况下,我正在使用Qt的MD5哈希实现,所以我想确保在我放弃Qt的方法或修改它们的源(在这里{{3)之前我没有其他的东西。和} md5.h,BTW)。
机器细节。服务器:CentOS 5.8 64位。客户端:Win7 64位,但在Windows上,此应用程序是使用32位版本的Qt编译的,并且是32位应用程序。
另外,我打算分发我的应用程序的32位和64位版本。如果这个问题与架构有关,我怎么能解决这个问题呢?我在使用Qt的源代码时遇到了困难?
编辑1 :我忘了提到我正在通过FTP以二进制模式传输所有文件,并且文件大小在客户端和服务器上匹配。我最初确信这是一个行结束问题,但似乎并非如此,因为即使在二进制模式FTP传输中我遇到了这个问题。
答案 0 :(得分:1)
除非您已经拥有,否则无需处理内容部分。
QCryptographicHash hash(QCryptographicHash::Md5);
QFile file(path);
if (file.open(QIODevice::ReadOnly))
{
if ( hash.addData(&file) )
return hash.result().toHex();
}
答案 1 :(得分:0)
你不应该使用readline更好的方法是在字节数组中读取它然后像这样计算哈希
QFile file("/home/opc0de/somefile.dat");
if (file.open(QIODevice::ReadOnly)) {
QByteArray fileData = file.readAll();
QByteArray hashData = QCryptographicHash::hash(fileData, QCryptographicHash::Md5);
qDebug() << hashData.toHex();
}
希望它有所帮助。