【问题标题】:How to use QDataStream::readBytes()如何使用 QDataStream::readBytes()
【发布时间】:2015-04-14 20:29:32
【问题描述】:

根据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() 有什么误解?

【问题讨论】:

  • 如果你不指定大小,QByteArray 构造函数需要一个以 nul 结尾的字符数组。
  • @cmannett85 啊,谢谢。但是,如果我首先使用&gt;&gt; 读取一系列quint8s,我会得到预期的1234,这似乎暗示我确实在构建预期的 QByteArray ....对吗?
  • @cmannett85 另外,我可以使用qDebug() 打印QByteArray。
  • @cmannett85 最后,在input_array 构造函数字符串的末尾添加\0 似乎不会改变代码的行为。

标签: c++ qt qt5.4


【解决方案1】:

文档对此的描述不够清楚,但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 读写任意数据。

【讨论】:

  • 啊,我认为这意味着生成的 char 数组将以 4 个字节的长度开始。
猜你喜欢
  • 2019-08-04
  • 2017-07-18
  • 1970-01-01
  • 2013-11-09
  • 2017-04-06
  • 1970-01-01
  • 2018-04-21
  • 1970-01-01
相关资源
最近更新 更多