如何使用QDataStream :: readBytes()

时间:2015-04-14 20:29:32

标签: c++ qt qt5.4

根据the documentation for readBytes()(在Qt 5.4的QDataStream中),我希望以下代码将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;

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

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

1 个答案:

答案 0 :(得分: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;

此外,您可以使用QDataStream::readRawDataQDataStream::writeRawData来读取和写入任意数据。