Как я могу определить общий размер QIODevice для чтения?

Я использую QT 5.3.

У меня есть большая вещь, записанная в QIODevice для чтения. Я хочу иметь прокси для получения данных, в то время как данные в QIODevice будут доступны для прочтения другим объектом. Поэтому, если я вызову readAll (), я получу все хорошо в прокси, но другой читатель не сможет получить никаких данных.

Я думаю, что я должен использовать peek (), но это, кажется, требует максимального размера. Я пытался передать size () или bytesAvailable (), но они не дали мне реальный размер. Вероятно, они возвращают размер буфера некоторого странного значения, равного 3287. Но мои данные столь же велики, как 1081530 байт.

Как я могу получить истинный размер моего QIODevice для чтения?

Редактировать: QIODevice, который я упомянул выше, на самом деле QNetworkReply. Я хочу создать прокси-сервер для просмотра данных запросов и ответов моей программы с помощью QWebView для доступа к некоторым флеш-играм. Я реализовал createRequest моего подкласса QNetworkAccessManager, и я хочу проанализировать то, что я перехватил с помощью сигнала Finish () ответа от createRequest.

Edit2: я заметил, что этот QIODevice является последовательным, поэтому размер неизвестен. Но как читать данные, не очищая их?

1

Решение

Ты можешь использовать QIODevice::seek а затем снова прочитайте данные
от seek documantion:

Для устройств с произвольным доступом эта функция устанавливает текущую позицию в
pos, возвращает true в случае успеха или false, если произошла ошибка. За
последовательные устройства, поведение по умолчанию — ничего не делать и возвращать
ложный.

1

Другие решения

Вы можете извлечь размер содержимого непосредственно из 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();
}
0

По вопросам рекламы [email protected]