QByteArray储存二进制数据(包括结构体,自定义QT对象)
来源:互联网 发布:js获取当前城市 编辑:程序博客网 时间:2024/05/29 17:33
因为利用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();
- }
阅读全文
0 0
- QByteArray储存二进制数据(包括结构体,自定义QT对象)
- QByteArray储存二进制数据(包括结构体,自定义QT对象)
- QByteArray储存二进制数据(包括结构体,自定义QT对象)
- QT: QByteArray储存二进制数据(包括结构体,自定义QT对象)
- QT:用QSet储存自定义结构体的问题
- QT:用QSet储存自定义结构体的问题
- QT:用QSet储存自定义结构体的问题
- 数据储存结构
- Java HashSet储存自定义对象
- Java HashMap 储存自定义对象
- QT:QByteArray和QByteArray、char *
- 二进制和数据储存的关系
- SQLITE数据库存储类对象 用到qt的QByteArray
- 二进制数据,二进制文件,二进制对象
- Qt入门-QByteArray类
- 动态储存结构体数组
- DBus如何传送和接收数据,包括结构体
- Qt学习之路(54): 自定义拖放数据对象
- 版权声明:本文为博主原创文章,未经博主允许不得转载。 今天重写一个delphi7的CS架构的软件,原本自带的控件是Indy9。现在升级到Indy10,用delphi XE5开发。发现idTcpSer
- 职责链模式
- CSS合集
- 记录自己的学习历程---关于JSP的几个面试点(新手学习笔记,并不能保证内容正确性,如有误请指教)
- 基础错题集
- QByteArray储存二进制数据(包括结构体,自定义QT对象)
- 转载_CI 系统搭建:Git、Gerrit与Jenkins
- 互联网时代,我眼中的架构变迁
- http webservice socket的区别(转)
- ndy 10终于随着Delphi2005发布了,不过indy套件在我的印象中总是复杂并且BUG不断,说实话,不是看在他一整套组件的面子上,我还是喜欢VCL原生的Socket组件,简洁,清晰。Indy9
- 高级装配
- 统计学---掌握数据的整体状态
- Win7下基于Anaconda安装TensorFlow
- weui学习总结——2、操作反馈