Добавить QByteArray в QDataStream?

Мне нужно заполнить QByteArray разными данными. Так что я использую QDataStream.

QByteArray buffer;
QDataStream stream(&buffer, QIODevice::WriteOnly);

qint8 dataHex= 0x04;
qint8 dataChar = 'V';

stream << dataHex<< dataChar;
qDebug() << buffer.toHex();  // "0456"  This is what I want

Однако я также хотел бы добавить QByteArray к buffer.

QByteArray buffer;
QDataStream stream(&buffer, QIODevice::WriteOnly);

qint8 dataHex= 0x04;
qint8 dataChar = 'V';
QByteArray moreData = QByteArray::fromHex("ff");

stream << dataHex<< dataChar << moreData.data(); // char * QByteArray::data ()
qDebug() << buffer.toHex();  // "045600000002ff00"  I would like "0456ff"

Что мне не хватает?


person TheMeaningfulEngineer    schedule 24.04.2014    source источник


Ответы (3)


когда добавляется char*, он предполагает завершение \0 и сериализуется с помощью writeBytes, который также сначала записывает размер (как uint32)

writeBytes' документ:

Записывает спецификатор длины len и буфер s в поток и возвращает ссылку на поток.

len сериализуется как quint32, за которым следует len байтов из s. Обратите внимание, что данные не закодированы.

вы можете использовать writeRawData, чтобы обойти это:

stream << dataHex<< dataChar;
stream.writeRawData(moreData.data(), moreDate.size());
person ratchet freak    schedule 24.04.2014

00000002 — это размер массива символов, который записывается в поток.

person Bgie    schedule 24.04.2014

Чего вам не хватает, так это того, что QDataStream — это не необработанные данные. Он имеет свой собственный простой формат сериализации. Это наиболее подходит для случаев использования, когда данные записываются (сериализуются) и считываются (десериализуются) с помощью QDataStream и с использованием надежного QIODevice (например, QBuffer или QFile).

Если вы хотите добавить необработанные данные в QBuffer, вы можете использовать подходящую перегрузку write метод. Но тогда вы могли бы просто добавить непосредственно к QByteArray.

person hyde    schedule 24.04.2014