将QByteArray附加到QDataStream?

时间:2014-04-24 13:55:32

标签: c++ qt 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"

我错过了什么?

3 个答案:

答案 0 :(得分:10)

当附加char*时,它会假定\0终止,并使用writeBytes序列化,这也会先写出大小(如uint32)

writeBytes' doc:

  

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

     

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

您可以使用writeRawData来规避它:

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

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