C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > Qt 存储QByteArray

Qt的QJsonObject存储QByteArray的方法实现

作者:上去我就QWER

本文主要介绍了Qt的QJsonObject存储QByteArray的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在 Qt 中,QJsonObject 本身不直接支持存储 QByteArray 类型(因为 JSON 标准仅支持字符串、数字、布尔、数组、对象、null 六种类型),但可以通过 Base64 编码 将 QByteArray 转换为 JSON 支持的字符串类型存储,读取时再解码回 QByteArray。

核心思路

JSON 仅支持字符串类型,因此:

  1. 存储:将 QByteArray 用 Base64 编码为 QString,再存入 QJsonObject;
  2. 读取:从 QJsonObject 中取出 QString,用 Base64 解码回 QByteArray。

Qt 提供了 QByteArray::toBase64() 和 QByteArray::fromBase64() 方法,直接支持该转换。

完整示例代码

#include <QCoreApplication>
#include <QJsonObject>
#include <QByteArray>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 1. 准备原始 QByteArray 数据(示例:二进制数据或文件内容)
    QByteArray originalData = "Hello QByteArray + QJsonObject!"; // 也可以是二进制数据(如图片、文件)
    qDebug() << "原始 QByteArray:" << originalData;

    // 2. 将 QByteArray 编码为 Base64 字符串(存入 QJsonObject)
    QJsonObject jsonObj;
    QString base64Str = originalData.toBase64(); // 编码为 Base64 字符串
    jsonObj["binaryData"] = base64Str; // 存入 JSON 对象

    // 3. 从 QJsonObject 读取并解码回 QByteArray
    QString retrievedBase64 = jsonObj["binaryData"].toString(); // 取出 Base64 字符串
    QByteArray decodedData = QByteArray::fromBase64(retrievedBase64.toUtf8()); // 解码

    // 验证结果
    qDebug() << "解码后的 QByteArray:" << decodedData;
    qDebug() << "是否一致:" << (originalData == decodedData);

    return a.exec();
}

关键细节说明

  1. Base64 编码的兼容性

    • Base64 编码后的字符串是纯 ASCII 字符,完全符合 JSON 字符串规范,可跨平台、跨语言解析(如 Java、Python 等也支持 Base64 解码)。
    • 若需要 URL 安全的 Base64 编码(避免 +、/ 等特殊字符),可使用 QByteArray::toBase64(QByteArray::Base64UrlEncoding),解码时对应 QByteArray::fromBase64(..., QByteArray::Base64UrlEncoding)。
  2. 二进制数据的处理:
    示例中用了字符串作为 QByteArray 内容,实际使用时,originalData 可以是任意二进制数据(如读取文件、网络传输的二进制流):

    // 示例:读取图片文件为 QByteArray
    QFile file("test.png");
    if (file.open(QIODevice::ReadOnly)) {
        QByteArray imageData = file.readAll();
        jsonObj["image"] = imageData.toBase64(); // 存入 JSON
        file.close();
    }
    
  3. 空数据处理
    若 QByteArray 为空,toBase64() 会返回空字符串,fromBase64() 也会解码为空,无需额外判断,兼容性良好。

扩展:使用自定义序列化(Qt 5.15+)

若使用 Qt 5.15 及以上版本,可通过 QJsonValue::fromVariant() 间接支持 QByteArray(本质还是 Base64 编码),但不推荐直接依赖(可读性差,跨语言不兼容):

// 不推荐(仅 Qt 内部兼容,跨语言解析困难)
jsonObj["binaryData"] = QJsonValue::fromVariant(originalData); 
QByteArray decodedData = jsonObj["binaryData"].toVariant().toByteArray();

总结

推荐使用 Base64 编码 方式存储 QByteArrayQJsonObject,优点是:

到此这篇关于Qt的QJsonObject存储QByteArray的方法实现的文章就介绍到这了,更多相关Qt 存储QByteArray内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文