Когда вы создаете QDataStream
, как вы это сделали, QBuffer
будет использоваться как внутренний QIODevice
(см. https://doc.qt.io/qt-5/qdatastream.html#QDataStream -2 ).
QBuffer
не будет работать как очередь FIFO, она просто запоминает, когда она закончила последнюю операцию, и начнет с этой точки другую операцию.
Когда вы что-то записали в свой поток, «позиция» будет перемещена после новых данных , Из-за того, что буфер был пуст в начале, курсор будет указывать на конец ваших данных, и любые попытки чтения потерпят неудачу. Если вы хотите прочитать то, что написали, вам придется переместить курсор назад.
Возможно, следующий пример прояснит эту идею:
QByteArray data;
QDataStream stream(&data, QIODevice::ReadWrite);
stream.setByteOrder(QDataStream::LittleEndian);
const std::uint32_t input = 0x01020304; // 0x01020304 = 16909060
qDebug() << "Device pos before write: " << stream.device()->pos();
stream << input;
qDebug() << "Device pos after write: " << stream.device()->pos();
qDebug() << "data content after write: " << data;
stream.device()->seek(0);
qDebug() << "Device pos after seek: " << stream.device()->pos();
std::uint32_t test;
stream >> test;
qDebug() << "Read: " << test;
qDebug() << "Device pos after read: " << stream.device()->pos();
Вывод:
Device pos before write: 0
Device pos after write: 4
data content after write: "\x04\x03\x02\x01"
Device pos after seek: 0
Read: 16909060
Device pos after read: 4