问题
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?
回答1:
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());
回答2:
The 00000002 is the size of the char array, which is written to the stream.
回答3:
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.
来源:https://stackoverflow.com/questions/23271029/append-a-qbytearray-to-qdatastream