2016-11-14 6 views
0

ファイルのチェックサムが必要ですが、それは完全に正常に動作するthisが見つかりました。今、私は次の行を前に開かれたQIODeviceへのポインタを取るために、この機能を変更したい:開いているQIODeviceのチェックサムを取得

if (!file.open(QFile::ReadOnly | QFile::Text)) 
{ 
    ... 
} 

これはデバイスとして(reader.read(&file);)を読むために渡されます。

bool XmlReader::read(QIODevice* device) 
{ 
    QByteArray b = fileChecksum(device); 
    ... 
} 

この私のfileChecksumの実装です。それはチェックサムを返しますが、私は永遠にループに巻き込まれており、私はxml解析エラーを取得しています。私はここで間違って何をしていますか?

QByteArray XmlReader::fileChecksum(QIODevice* device) 
{ 
    if (device->isOpen()) 
    { 
     QCryptographicHash hash(QCryptographicHash::Sha256); 
     if (hash.addData(device)) { 
      return hash.result(); 
     } 

    } 
    return QByteArray(); 
} 

私は右QByteArray b = fileChecksum(device);後EDIT

印刷と印刷と印刷を続けるwhick
qDebug() << "Checksum: " << b.toHex(); 

...

パースエラーがある:ゴミですpremature end of document

これが役に立ちます。

+0

正確なエラーテキストを投稿してください。また、どのループに巻き込まれているかはあまり明確ではありません。明確にしてください。 – demonplus

+0

@tobilockerエラーは、この質問には含まれていないコードの部分です。 'addData'関数はファイル全体を読み込み、カーソルを"巻き戻さない "ので、' auto pos = device-> pos(); QByteArray b = fileChecksum(device ); device-> seek(pos); ' – PeterT

+0

@PeterTそれはそれをしました!完璧!それらの行を答えとして追加するだけで、私はそれを受け入れることができます。 – tobilocker

答えて

1

最終的にエラーの原因となったコード行は表示されていないので、私は起こったことを推測することしかできません。

hash.addData(device)という名前のファンクションは、QIODevice until the endを読み取り、そこでカーソル位置を保持しています。

ほとんどの場合、QIODeviceからpremature end of documenメッセージを説明するように読み込もうとしました。あなただけ

auto pos = device->pos(); 
QByteArray b = fileChecksum(device); 
device->seek(pos); 

と後で位置をリセットしようとすることができますしかし、あなたは(あまりにも非ランダム・アクセス・QIODevicesをサポートする)ことができる場合、あなたは一度だけデータを読み込む必要があり、高速回避策として

。たとえば、QBufferに結果を格納し、それをQIODeviceとして使用することができます。このように:

bool XmlReader::read(QIODevice* device) 
{ 
    QByteArray contents = device->readAll(); 
    QBuffer buffer(&contents); 
    device = &buffer;//you can also just use &buffer from here on out instead of overwriting the pointer 
    QByteArray b = fileChecksum(device); 
    device->reset(); 
    /* ... further reads from device here */ 
} 
+0

推測が確定しました!ありがとう。 – tobilocker

+0

あなたはこの権利をテストしていませんか?上記はコンパイルされません。提案された解決策には、 'QBuffer'でいくつかのエラーがあります。 'QByteArray contents = device.readAll();'はデバイスがポインタであるので明らかに動作しません。 'QBuffer'コンストラクタは' QByteArray'へのポインタを受け取り、 'QBuffer buffer(&contents)'でなければなりません。また、これは、同じパーサエラー「文書の早期終了」をもたらす。 – tobilocker

+0

@tobilockerうん、コンパイルしようとしなかった。また、エラーが表示される場合は、私が想定していなかった 'XmlReader :: read'関数の外で' device'から読み込んでいる可能性があります。私はあなたが渡す 'QIODevice'がランダムアクセスデバイスであることを確かめて、最初の回避策に頼ることができます。 – PeterT

関連する問題