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

相关文章

sqlserver、mysql、oracle、pgsql、sqlite五大关系数据库的对象名称和转义字符

《sqlserver、mysql、oracle、pgsql、sqlite五大关系数据库的对象名称和转义字符》:本文主要介绍sqlserver、mysql、oracle、pgsql、sqlite五大... 目录一、转义符1.1 oracle1.2 sqlserver1.3 PostgreSQL1.4 SQLi

Redis中Set结构使用过程与原理说明

《Redis中Set结构使用过程与原理说明》本文解析了RedisSet数据结构,涵盖其基本操作(如添加、查找)、集合运算(交并差)、底层实现(intset与hashtable自动切换机制)、典型应用场... 目录开篇:从购物车到Redis Set一、Redis Set的基本操作1.1 编程常用命令1.2 集

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

JavaScript对象转数组的三种方法实现

《JavaScript对象转数组的三种方法实现》本文介绍了在JavaScript中将对象转换为数组的三种实用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录方法1:使用Object.keys()和Array.map()方法2:使用Object.entr

C#中通过Response.Headers设置自定义参数的代码示例

《C#中通过Response.Headers设置自定义参数的代码示例》:本文主要介绍C#中通过Response.Headers设置自定义响应头的方法,涵盖基础添加、安全校验、生产实践及调试技巧,强... 目录一、基础设置方法1. 直接添加自定义头2. 批量设置模式二、高级配置技巧1. 安全校验机制2. 类型

使用MapStruct实现Java对象映射的示例代码

《使用MapStruct实现Java对象映射的示例代码》本文主要介绍了使用MapStruct实现Java对象映射的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、什么是 MapStruct?二、实战演练:三步集成 MapStruct第一步:添加 Mave

C#使用iText获取PDF的trailer数据的代码示例

《C#使用iText获取PDF的trailer数据的代码示例》开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所... 目录引言iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程

Pandas处理缺失数据的方式汇总

《Pandas处理缺失数据的方式汇总》许多教程中的数据与现实世界中的数据有很大不同,现实世界中的数据很少是干净且同质的,本文我们将讨论处理缺失数据的一些常规注意事项,了解Pandas如何表示缺失数据,... 目录缺失数据约定的权衡Pandas 中的缺失数据None 作为哨兵值NaN:缺失的数值数据Panda

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

Java中实现对象的拷贝案例讲解

《Java中实现对象的拷贝案例讲解》Java对象拷贝分为浅拷贝(复制值及引用地址)和深拷贝(递归复制所有引用对象),常用方法包括Object.clone()、序列化及JSON转换,需处理循环引用问题,... 目录对象的拷贝简介浅拷贝和深拷贝浅拷贝深拷贝深拷贝和循环引用总结对象的拷贝简介对象的拷贝,把一个