前言
我正在开发一个需要在两台机器(客户端和服务器)之间传输 FTP 文件的项目。我想通过比较客户端上生成的 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 散列。但是,在我的客户端上散列时为同一文件生成不同的散列值,而不是在我的服务器上散列时生成的散列值不同。我一直在努力解决这个问题,但似乎无法确定为什么这些哈希不匹配。我最后的想法是,这可能是与架构相关的问题,正如这篇 SO 帖子中所讨论的那样。但是,就我而言,我使用的是 Qt 的 MD5 散列实现,所以我想确保在我放弃 Qt 的方法或修改它们的源代码(这里是md5.h在这里md5.cpp,顺便说一句)。
机器细节。服务器:CentOS 5.8 64 位。客户端:Win7 64 位,但在 Windows 上,此应用程序是使用 Qt 的 32 位版本编译的,并且是 32 位应用程序。
顺便说一句,我打算同时分发我的应用程序的 32 位和 64 位版本。如果它与架构相关并且我被困在使用 Qt 的源代码,我该如何调和这个问题?
编辑 1:我忘了提到我正在通过 FTP 以二进制模式传输所有文件,并且文件大小在客户端和服务器上匹配。我最初确信这是一个行尾问题,但似乎并非如此,因为即使在二进制模式 FTP 传输中我也遇到了这个问题。