将 QByteArray 追加到 QDataStream 中?

4
我需要填充一个,并存入不同的数据。因此我正在使用。
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"

我错过了什么?
3个回答

13

当附加一个 char* 时,它会假定以 \0 结尾并使用 writeBytes 进行序列化,写出大小(作为 uint32)。

writeBytes 的文档:

将长度指示符 len 和缓冲区 s 写入流中,并返回对流的引用。

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

你可以使用 writeRawData 来绕过它:

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

3

00000002是字符数组的大小,该大小会被写入流中。


2
你所缺少的是,QDataStream 并不是原始数据。它有自己简单的序列化格式。它最适用于那些需要使用 QDataStream 进行写入(序列化)和读取(反序列化)数据,并且使用可靠的 QIODevice(例如 QBufferQFile)的情况。
如果你想向 QBuffer 添加原始数据,可以使用 write 方法 的适当重载。但这时你可能直接将数据附加到 QByteArray 上更为方便。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接