Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将具有已知QMetaType::Type的QByteArray反序列化为QVariant_C++_Qt - Fatal编程技术网

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等,那么您必须自己进行序列化。