1

前文

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

4

2 に答える 2

1

既にコンテンツを持っていない限り、コンテンツ部分に取り組む必要はありません。

QCryptographicHash hash(QCryptographicHash::Md5);     
QFile file(path);
 if (file.open(QIODevice::ReadOnly))
    {

       if ( hash.addData(&file) )
           return hash.result().toHex();


    }
于 2016-02-10T08:58:39.640 に答える
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();
    }

それが役に立てば幸い。

于 2012-10-31T07:13:53.263 に答える