如何使用 QDataStream::readBytes()
Posted
技术标签:
【中文标题】如何使用 QDataStream::readBytes()【英文标题】:How to use 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 啊,谢谢。但是,如果我首先使用>>
读取一系列quint8
s,我会得到预期的1
、2
、3
、4
,这似乎暗示我确实在构建预期的 QByteArray ....对吗?
@cmannett85 另外,我可以使用qDebug()
打印QByteArray。
@cmannett85 最后,在input_array
构造函数字符串的末尾添加\0
似乎不会改变代码的行为。
【参考方案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::readRawData
和QDataStream::writeRawData
读写任意数据。
【讨论】:
啊,我认为这意味着生成的char
数组将以 4 个字节的长度开始。以上是关于如何使用 QDataStream::readBytes()的主要内容,如果未能解决你的问题,请参考以下文章
如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]
如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?