QByteArray储存二进制数据(包括结构体,自定义QT对象)

2024-01-25 18:08

本文主要是介绍QByteArray储存二进制数据(包括结构体,自定义QT对象),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

     因为利用QByteArray可以很方便的利用其API对内存数据进行访问和修改, 构建数据库blob字段时必不可少; 那如何向blob内写入自定义的结构体和类

    1. 利用memcpy拷贝内存数据

    //自定义person结构体

typedef struct
{int age;char name[20];
}Person;//向QByteArray写入多个结构体
void writeStruct()
{QByteArray ba;ba.resize(2*sizeof(Person)); //设置容量//序列化for(int i=0;i<2;i++){Person p1;p1.age=10+i;strcpy(p1.name,"javaeye");memcpy(ba.data()+i*sizeof(Person),&p1,sizeof(Person)); //指针移动,写入多个数据}//还原数据Person *person=(Person*)ba.data();qDebug()<<person->age<<"---"<<person->name;person++;qDebug()<<person->age<<"---"<<person->name;
}
 

 

   memcpy只能处理字段为基本类型的结构体, 当使用QString name, 我用person->name去访问其值, 程序崩溃; 由此可见,内存数据无法还原构建成QString类. 如果要写入自定的QT类, 只能借助QBuffer了, 通过二进制流写入

 

  2. QBuffer写入QT自定义结构体

   

//QBuffer序列化自定义对象
typedef struct
{int age;QString name;
}QPerson;/***@brief 重载自定义对象的输入*/
inline QDataStream &operator<<(QDataStream &out,const QPerson &per)
{out<<per.age<<per.name;return out;
}/***@brief 重载自定义对象的输出*/
inline QDataStream &operator>>(QDataStream &in,QPerson &per)
{int age;QString name;in>>age>>name;per.age=age;per.name=name;return in;
}/*** @brief QBuffer能处理QT自定义类型*/
void testQBuffer()
{QByteArray ba;ba.resize(2*sizeof(QPerson));QBuffer buffer(&ba);buffer.open(QIODevice::WriteOnly);//输入QDataStream out(&buffer);for(int i=0;i<2;i++){QPerson per;per.age=20+i;per.name=QString("sun_%1").arg(i+1);out<<per;}buffer.close();//输出QBuffer buf(&ba);buf.open(QIODevice::ReadOnly);QDataStream in(&buf);for(int i=0;i<2;i++){QPerson per;in>>per;qDebug()<<per.age<<"---"<<per.name;}buf.close();
}

 

这篇关于QByteArray储存二进制数据(包括结构体,自定义QT对象)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/644143

相关文章

Java+AI驱动实现PDF文件数据提取与解析

《Java+AI驱动实现PDF文件数据提取与解析》本文将和大家分享一套基于AI的体检报告智能评估方案,详细介绍从PDF上传、内容提取到AI分析、数据存储的全流程自动化实现方法,感兴趣的可以了解下... 目录一、核心流程:从上传到评估的完整链路二、第一步:解析 PDF,提取体检报告内容1. 引入依赖2. 封装

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

使用SpringBoot+InfluxDB实现高效数据存储与查询

《使用SpringBoot+InfluxDB实现高效数据存储与查询》InfluxDB是一个开源的时间序列数据库,特别适合处理带有时间戳的监控数据、指标数据等,下面详细介绍如何在SpringBoot项目... 目录1、项目介绍2、 InfluxDB 介绍3、Spring Boot 配置 InfluxDB4、I

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定

聊聊springboot中如何自定义消息转换器

《聊聊springboot中如何自定义消息转换器》SpringBoot通过HttpMessageConverter处理HTTP数据转换,支持多种媒体类型,接下来通过本文给大家介绍springboot中... 目录核心接口springboot默认提供的转换器如何自定义消息转换器Spring Boot 中的消息

Java整合Protocol Buffers实现高效数据序列化实践

《Java整合ProtocolBuffers实现高效数据序列化实践》ProtocolBuffers是Google开发的一种语言中立、平台中立、可扩展的结构化数据序列化机制,类似于XML但更小、更快... 目录一、Protocol Buffers简介1.1 什么是Protocol Buffers1.2 Pro

Java集合中的链表与结构详解

《Java集合中的链表与结构详解》链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序的通过链表中的引用链接次序实现,文章对比ArrayList与LinkedList的结构差异,详细讲解了链表... 目录一、链表概念与结构二、当向单链表的实现2.1 准备工作2.2 初始化链表2.3 打印数据、链表长

Python实现数据可视化图表生成(适合新手入门)

《Python实现数据可视化图表生成(适合新手入门)》在数据科学和数据分析的新时代,高效、直观的数据可视化工具显得尤为重要,下面:本文主要介绍Python实现数据可视化图表生成的相关资料,文中通过... 目录前言为什么需要数据可视化准备工作基本图表绘制折线图柱状图散点图使用Seaborn创建高级图表箱线图热

MySQL数据脱敏的实现方法

《MySQL数据脱敏的实现方法》本文主要介绍了MySQL数据脱敏的实现方法,包括字符替换、加密等方法,通过工具类和数据库服务整合,确保敏感信息在查询结果中被掩码处理,感兴趣的可以了解一下... 目录一. 数据脱敏的方法二. 字符替换脱敏1. 创建数据脱敏工具类三. 整合到数据库操作1. 创建服务类进行数据库

MySQL中处理数据的并发一致性的实现示例

《MySQL中处理数据的并发一致性的实现示例》在MySQL中处理数据的并发一致性是确保多个用户或应用程序同时访问和修改数据库时,不会导致数据冲突、数据丢失或数据不一致,MySQL通过事务和锁机制来管理... 目录一、事务(Transactions)1. 事务控制语句二、锁(Locks)1. 锁类型2. 锁粒