Question

I have to populate a QByteArray with different data. So I'm using the 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

However, I would also like to append a QByteArray to the 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"

What am I missing?

Was it helpful?

Solution

when a char* is appended it assumes \0 termination and serializes with writeBytes which also writes out the size first (as uint32)

writeBytes' doc:

Writes the length specifier len and the buffer s to the stream and returns a reference to the stream.

The len is serialized as a quint32, followed by len bytes from s. Note that the data is not encoded.

you can use writeRawData to circumvent it:

stream << dataHex<< dataChar;
stream.writeRawData(moreData.data(), moreDate.size());

OTHER TIPS

The 00000002 is the size of the char array, which is written to the stream.

What you are missing is, QDataStream is not raw data. It has its own simple serialization format. It is most suitable for use cases where data is both written (serialized) and read back (deserialized) with QDataStream, and using a reliable QIODevice (QBuffer or QFile for example).

If you want to add raw data to a QBuffer, you could use a suitable overload of write method. But then you might as well just append to the QByteArray directly.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top