问题描述
问题
我有一个接口,它给我一个任意类型的 QVariant
。我需要将此变体中的数据内容转换为原始二进制 QByteArray
:
QVariant result = myQVariantReturningMethod(type arg,type arg2);
QByteArray rawResult = ?;
背景
结果 QByteArray
通过 Canbus 发送。根据它的大小,它以几个罐头帧或单个帧的形式传输。用于发送帧的 can 总线接口将 QByteArray
作为输入。根据附加信息,can 帧的接收者知道如何解析传入的 can 帧流。
到目前为止我尝试了什么
我尝试了几种方法
- 使用
QDataStream
将数据放入数组中。然而,序列化以不可预测的方式工作,我总是在结果数组中获得有关类型本身的其他信息,具体取决于类型的<</>>
运算符的实现。 - 使用
toString().toStdString()
的QVariant
,产生一个强制转换的值,而不是实际的二进制原始数据,这不是我想要的。 - 使用
toBytearryay()
,结果相同。
我不在乎 stl
方式还是 qt
方式是解决问题的可能方法。但是,它必须c++11
兼容
解决方法
事实证明,QVariant
有一个未公开的方法 constData()
,它给出了我想要的结果:指向 QVariant
内部存储数据的指针。连同 QMetaType::sizeOf()
,这正是将所有数据写入 QByteArray
所需要的。
我发现该方法记录在 Qt 6.0
的文档中,并且发现它也适用于我的 Qt 5.12.7
,尽管相应的文档中没有描述。