4

我必须QByteArray用不同的数据填充 a 。所以我正在使用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"

我错过了什么?

4

3 回答 3

13

char*附加 a 时,它假定\0终止并序列化,writeBytes其中也首先写出大小(如 uint32)

writeBytes' 文档:

将长度说明符 len 和缓冲区 s 写入流并返回对流的引用。

len 被序列化为 quint32,后跟来自 s 的 len 个字节。请注意,数据未编码。

你可以writeRawData用来规避它:

stream << dataHex<< dataChar;
stream.writeRawData(moreData.data(), moreDate.size());
于 2014-04-24T14:02:17.747 回答
3

00000002 是写入流的 char 数组的大小。

于 2014-04-24T14:01:37.580 回答
2

您缺少的是,不是QDataStream原始数据。它有自己的简单序列化格式。它最适用于使用可靠(或例如)写入(序列化)和回读(反序列化)数据的用例。QDataStreamQIODeviceQBufferQFile

如果要将原始数据添加到 a QBuffer,可以使用适当的write方法重载。但是你也可以QByteArray直接附加到。

于 2014-04-24T15:18:59.517 回答