2

私はqt 5.3を使用しています。

読み取り用に QIODevice に大きなものを書き込んでいます。QIODeviceのデータを他の人が読み取れるように保ちながら、データを取得するためのプロキシが必要です。したがって、 readAll() を呼び出すと、プロキシですべてが適切に取得されますが、他のリーダーはデータを取得できません。

peek() を使用する必要があると思いますが、これには maxsize が必要なようです。size() または bytesAvailable() を渡そうとしましたが、実際のサイズを取得できませんでした。彼らはおそらく 3287 という奇妙な値のバッファ サイズを返します。しかし、私のデータは 1081530 バイトと巨大です。

読み取り用の QIODevice の実際のサイズを取得するにはどうすればよいですか?

編集: 上記で言及した QIODevice は、実際には QNetworkReply です。QWebView を使用してプログラムの要求と応答のデータを観察し、いくつかのフラッシュ ゲームにアクセスするためのプロキシを作成したいと考えています。QNetworkAccessManager のサブクラスの createRequest を実装しました。分析したいのは、createRequest からの応答の finished() シグナルを介してキャッチしたものです。

Edit2: この QIODevice はシーケンシャルなものであるため、サイズが不明です。しかし、データを消去せずに読み取る方法は?

4

2 に答える 2

1

ドキュメント からQIODevice::seekデータを使用して再度読み取ることができます。
seek

ランダム アクセス デバイスの場合、この関数は現在位置を pos に設定し、成功した場合は true を返し、エラーが発生した場合は false を返します。シーケンシャル デバイスの場合、既定の動作は何もせずに false を返します。

于 2014-08-05T11:41:18.577 に答える
0

QNetworkReply次のように、Qt を使用してヘッダーからコンテンツのサイズを直接抽出できます。

qlonglong size = reply->header(QNetworkRequest::ContentLengthHeader).toLongLong();

次に、そのサイズをpeek関数で使用します。例:

void DownloadManager::downloadFinished(QNetworkReply *reply)
{
    if (!reply->error())
    {
        bool ok;
        qlonglong size = reply->header(QNetworkRequest::ContentLengthHeader).toLongLong(&ok);

        if (ok)
        {
            QByteArray data = reply->peek(size); //Here lives your data without reset the internal buffer
            //Do something
        }
        else
        {
            qDebug() << "Could not read the header";
        }
    }

    //If you are ready then delete
    reply->deleteLater();
}
于 2014-08-11T08:45:12.030 に答える