C++ 将具有已知QMetaType::Type的QByteArray反序列化为QVariant
我有一个包含变量原始数据的C++ 将具有已知QMetaType::Type的QByteArray反序列化为QVariant,c++,qt,C++,Qt,我有一个包含变量原始数据的QByteArray。 描述变量的QMetaType::Type是已知的 我想将此变量反序列化为QVariant 通过以下输入: QByteArray字节;//考虑它初始化 QMetaType::Type Type;//同样的 到目前为止,我的尝试没有成功: QVariant{bytes}; 变量转换(类型);//不起作用,显然QVariant希望字节是变量的字符串表示形式 QDataStream ds(字节,QIODevice::只读); qvar; ds>>va
QByteArray
。描述变量的
QMetaType::Type
是已知的
我想将此变量反序列化为QVariant
通过以下输入:
QByteArray字节;//考虑它初始化
QMetaType::Type Type;//同样的
到目前为止,我的尝试没有成功:
QVariant{bytes};
变量转换(类型);//不起作用,显然QVariant希望字节是变量的字符串表示形式
QDataStream ds(字节,QIODevice::只读);
qvar;
ds>>var;//不起作用,因为字节不是来自QVariant的序列化(尤其是缺少类型信息)
我无法更改输入或输出类型:
- 输入的类型必须为
和QByteArray
QMetaType::type
- 输出类型必须为
QVariant
//输入
QByteArray字节={0x12、0x34、0x56、0x78};
QMetaType::Type Type=QMetaType::UInt;//假设无符号整数的大小为4字节(可以是2)
//注意:这是一个例子,在实践中,我必须管理许多类型,包括double
//预期产出:
QVariant var=反序列化(字节,类型);
//变量类型()==QMetaType::UInt
//变量toUInt()==305419896(=0x12345678)
您可以写入无符号整数
,然后将其转换为QVariant
:
const char data[] = { 0x12, 0x34, 0x56, 0x78 };
QByteArray bytes { QByteArray::fromRawData( data, 4) };
QDataStream s {&bytes, QIODevice::ReadOnly};
//write out the data to uint
unsigned int x{};
s >> x;
//create a Qvariant from it
QVariant var{x};
qDebug () << "x: " << x; //305419896
qDebug () << "variant: " << var; //QVariant(uint, 305419896)
qDebug () << "variant uint: " << var.toUInt(); //305419896
auto v = QVariant(bytes.toHex().toUInt());
//auto v = QVariant(bytes.toUInt()); //this will not work
qDebug () << "Bytes to uint; " << v.toUInt(); //305419896
面对同样的问题,我使用提供的类型id直接从
QByteArray
通过其data()
方法构建QVariant
:
QByteArray bytes; // Consider it initialized
QMetaType::Type type; // Same
QVariant result(type.id(),bytes.data());
如果构造失败,您将得到一个无效的
QVariant
,但到目前为止,对于我的类型,它工作得很好。为什么不简单地这样做:auto v=QVariant(bytes.toUInt())代码>?因为unsigned int
不是我将接收的唯一类型,所以这只是一个示例。我希望避免单独管理每种类型。您找到有效的解决方案了吗?我希望避免转换为实际类型,然后再转换为QVariant
。在实践中,我将收到许多不同类型的输入。必须管理每一种类型将是乏味的。使用toHex()。是的,但是如果类型是用户定义的类型,而不是简单的int、short、long等,那么您必须自己进行序列化。