前文
クライアントとサーバーの 2 台のマシン間で 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 転送でも問題が発生しているため、そうではないようです。