如何使用QDataStream :: readBytes()

Kyl*_*and 3 c++ qt qt5.4

根据(在Qt 5.4的QDataStream中)的文档readBytes(),我希望以下代码复制input_array到新分配的内存并指向raw副本:

QByteArray input_array{"\x01\x02\x03\x04qwertyuiop"};
QDataStream unmarshaller{&input_array, QIODevice::ReadOnly};

char* raw;
uint length;
unmarshaller.readBytes(raw, length);

qDebug() << "raw null? " << (raw == nullptr) << " ; length = " << length << endl;
Run Code Online (Sandbox Code Playgroud)

...但代码打印raw null? true ; length = 0,表示没有从输入数组中读取字节.

为什么是这样?我误解了readBytes()什么?

han*_*ank 5

文档没有足够清楚地描述这一点,但QDataStream::readBytes期望数据采用某种格式:quint32数据长度的一部分,然后是数据本身.

因此,使用QDataStream::readBytes您来读取数据应首先使用QDataStream::writeBytes或使用正确的格式以任何其他方式编写它.

一个例子:

QByteArray raw_input = "\x01\x02\x03\x04qwertyuiop";

QByteArray ba;

QDataStream writer(&ba, QIODevice::WriteOnly);
writer.writeBytes(raw_input.constData(), raw_input.length());

QDataStream reader(ba);

char* raw;
uint length;
reader.readBytes(raw, length);

qDebug() << "raw null? " << (raw == NULL) << " ; length = " << length << endl;
Run Code Online (Sandbox Code Playgroud)

您还可以使用QDataStream::readRawDataQDataStream::writeRawData读取和写入任意数据.