- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要将 QVariantMap
序列化为 QByteArray
,看起来合适的方法是通过 QDataStream
。但是,这样做我遇到了很多麻烦。我没有收到任何错误,但实际上并没有将任何内容保存到字节数组。
//Create a QVariantMap that has a key value pair
QVariantMap *myMap = new QVariantMap();
myMap->insert("MyKey","the value for MyKey");
// Serialize it to a QBiteArray using a QDataStream object
QByteArray byteArray;
QDataStream stream(&byteArray, QIODevice::WriteOnly);
//qDebug() << byteArray.toHex(); ==> "" (because byteArray is empty)
stream << myMap;
//qDebug() << byteArray.toHex(); ==> "01" (regardless of what the key/value/etc. was, it's always 01)
//Test whether I can read it out
QVariantMap inMap;
QDataStream inStream(&byteArray, QIODevice::ReadOnly);
instream >> inMap;
//qDebug() << inMap.keys(); ==> () (No keys are in the map)
所以没有错误或明显的失败,但实际上它仍然没有将任何值(除了 01——大小?)放入 ByteArray。我已经尝试了很多关于这个主题的变体,没有一个有任何不同的结果(除了只会导致错误的变体)。
我所做的唯一有区别的事情是多行“stream << myMap”,它将 byteArray 设置为“010101”,例如,如果我重复该行 3 次。所以每次我运行“stream << myMap”时,我都会再得到一个“01”。
我担心我可能只是读取了错误的代码而写入却没问题,这就是为什么我添加了检查十六进制代码的调试行,并明确指出存在写入错误。
最佳答案
您的代码中有错误。您要发送给 byteArray
的内容不是 QVariantMap
, 它是一个指向 QVariantMap
的指针.这只是将地址发送到数组而不是 map 数据。此更改stream << (*myMap);
应该适合你。
下面是一个工作示例:
QVariantMap myMap, inMap;
QByteArray mapData;
myMap.insert("Hello", 25);
myMap.insert("World", 20);
QDataStream outStream(&mapData, QIODevice::WriteOnly);
outStream << myMap;
qDebug() << myMap;
QDataStream inStream(&mapData, QIODevice::ReadOnly);
inStream >> inMap;
qDebug() << inMap;
输出
QMap(("Hello", QVariant(int, 25) ) ( "World" , QVariant(int, 20) ) )
QMap(("Hello", QVariant(int, 25) ) ( "World" , QVariant(int, 20) ) )
请注意,我已经在我的实现中删除了指针。我确实更喜欢尽可能使用范围变量,并建议您这样做。这是一种获取和释放资源的简单方法,可以让您免于处理破坏工作。
关于c++ - 使用 QDataStream 将 QVariantMap 序列化为 QByteArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25614907/
我正在使用 QMap RegTable; (Seprate Class Variable) 用于存储 Modbus 寄存器地址和从串口接收到的数据。一切正常,从串口读取数据并正确填充到 QByteA
假设我们有一个功能商店 void store(const QByteArray& data); 此函数的工作是获取数据 并将其存储起来。不幸的是,如果参数是用 QByteArray::fromRawD
我有一个非常简单的加密/解密程序。加密后,我的程序将加密文本作为 QByteArray 返回,然后我将其保存到文本文件中。从文件中检索 ByteArray 进行解密时,我不确定它的格式是否正确,或者文
请帮助进行这些转换。这是输入; QByteArray byteArr; QBitArray bitArr; QFile file(adress); byteArr.readAll(file); 从字节
检查 QByteArray 的大小总是返回 4 个字节,我假设是由于 Qt 中隐式共享数据: int n = 50; //or n = 100, 200 QByteArray arr(n,'a');
我需要编写一个函数来获取 optional 的所有权的底层数组。 在Rust中,是这样实现的: fn my_func(f: &mut Option>) -> Box { //how to d
我想创建 SerialPort 类,它可以自动接收消息,然后发出信号。 但是当我编译它时显示错误信息: error: 'QObject' is an ambiguous base of 'Serial
正如您可能从标题中发现的那样,我在转换 QByteArray 时遇到了问题。为整数。 QByteArray buffer = server->read(8192); QByteArray q_si
我目前在使用 QSerialPort 时遇到了一些问题:当我使用一个示例中的函数时,它看起来像 QKeyEvent *e; emit getData(e->text().toLocal8Bit());
我有一个像这样的自定义结构: struct aReminderStruct{ QString name; QDate date; QTime time; QString
我正在使用 Qt 和 C++。我必须管理电子板的错误代码。我可以以必须将其转换为 QVariant 的 QByteArray 的形式获取这些错误。我没有找到任何实用的方法来做到这一点(所以如果你有一个
使用 QByteArray QIODevice::readAll()从 QT5 开始,我能够从 txt 文件或图像制作字节数组,之后使用解码并正确地重新创建文件。但是,当我尝试使用 .db 文件 (S
我有一个文本编辑器,我在其中键入十六进制数字,然后将此文本转换为 QByteArray。 这是我的代码: QByteArray parsedValue = QByteArray::fromHex(ex
尝试编写一个非常简单的 Qt 程序(因为这就是我的全部能力!)... ...我已将一个相当小的二进制文件读入 QbyteArray,我可以看到 QByteArray 正确地保存了该数据。我想将一个指向
我有以下代码需要从纯 C++ 转换为 qt: // txMessage and UserData are char arrays memcpy(&txMessage[18], UserData, 8)
我想在 Qt 中将数组转换为 QByteArray。有人可以解释这个概念吗?请举例说明。 最佳答案 QByteArray 有一个 constructor就是这样做的。 这是如何使用它: const c
为什么声明: QByteArray data (initialized somehow); if(data.at(0) == 0xFF) do_something(); 发出这样的警告:由于数据类型
从 QByteArray 开始,我想在我的 QByteArray 中搜索“\n”字符,并将所有字符从头到“\n”连接起来,并将它们保存在 QString 中;之后,我将传递到下一个“\n”之前的以下字
我需要转换一个 QString 这是 已经以十六进制格式转换为 QByteArray。例如: QString a = "AF5603B4" 应存储在 QByteArray 中: QByteArray
在我的程序中,我经常使用串行通信,所以 QByteArray经常使用。 我想知道是否有更短的方法来初始化 QByteArray具有特定字节比: const char test_data[] = {
我是一名优秀的程序员,十分优秀!