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