Qt: странное поведение QByteArray::replace

Написал такой слот:
ba = new QByteArray(length,'\0');
lastPos = 0;

QNetworkReply *reply = manager->get(request);
connect(reply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(slotDownloadProgress(qint64,qint64)));

void Player::slotDownloadProgress(qint64 cur, qint64 tot)
{

    if(cur > 256000)
    {
                QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender());
                ba->replace(lastPos,reply->bytesAvailable(),reply->readAll());
                lastPos = cur+1;
                if (media->state() == Phonon::StoppedState)
                {
                    media->setCurrentSource(Phonon::MediaSource(buffer));
                    emit timeToPlay();
                }
    }
}

В данном примере replace почему-то срабатывает как insert. В итоге я получаю QByteArray размером в два раза больше положенного, т.е. информация в процессе загрузки записывается, но нули, которыми я забил QByteArray при инициализации, не заменяются, а так и остаются в конце байтового массива.

Пишу простенький пример:
#include <QCoreApplication>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QByteArray *ba = new QByteArray(100,'\0');
    qDebug() << ba->size();
    ba->replace(0,10,"1234567890");
    qDebug() << ba->size();
    return a.exec();
}

Естественно работает так, как надо.
  • Вопрос задан
  • 3293 просмотра
Решения вопроса 1
PavelK
@PavelK
Ничего странного нет.
Вы указываете ему сколько заменить а НА СКОЛЬКО (четвёртый параметр функции)
не указали. Вот он и допихивает после замены остальное, сдвигая при этом то, что было.
Как то так:
ba->replace(lastPos, ba->size(), reply->readAll(), reply->bytesAvailable());

Или если Вам нужно оставить то, что было в исходном массиве, то и вторым и четвёртым параметром укажите одинаковое значение - сколько заменять, т.е. reply->bytesAvailable()
Надеюсь, заработает, но лучше свериться с документацией.

Пример работает потомучто строка такой же длины как и сколько нужно заменить, поэтому впихивать уже нечего.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
nightvision
@nightvision Автор вопроса
Вариант от PavelK работает, но в моем случае также сработало следующее:

qint64 available = reply->bytesAvailable();
                qDebug() << available;
                ba->replace(lastPos,available,reply->readAll());

т.е. сначала запись в переменную, а потом передача в функцию. Странно, но сработало
возможно что функции-аргументы для
ba->replace(lastPos,reply->bytesAvailable(),reply->readAll());

вызываются начиная с последнего.
Таким образом reply->bytesAvailable() вызывается после reply->readAll() и равно 0
вы поменяли порядок вызова и всё заработало.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы