如何从任意类型的 QVariant 获取原始二进制内容到 QBytearray 中?

问题描述

问题

我有一个接口,它给我一个任意类型的 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,尽管相应的文档中没有描述。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...