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

1. 利用memcpy拷贝内存数据

//自定义person结构体

  1. typedef struct
  2. {
  3. int age;
  4. char name[20];
  5. }Person;
  6. //向QByteArray写入多个结构体
  7. void writeStruct()
  8. {
  9. QByteArray ba;
  10. ba.resize(2*sizeof(Person)); //设置容量
  11. //序列化
  12. for(int i=0;i<2;i++)
  13. {
  14. Person p1;
  15. p1.age=10+i;
  16. strcpy(p1.name,"javaeye");
  17. memcpy(ba.data()+i*sizeof(Person),&p1,sizeof(Person)); //指针移动,写入多个数据
  18. }
  19. //还原数据
  20. Person *person=(Person*)ba.data();
  21. qDebug()<<person->age<<"---"<<person->name;
  22. person++;
  23. qDebug()<<person->age<<"---"<<person->name;
  24. }

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

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

  1. //QBuffer序列化自定义对象
  2. typedef struct
  3. {
  4. int age;
  5. QString name;
  6. }QPerson;
  7. /**
  8. *@brief 重载自定义对象的输入
  9. */
  10. inline QDataStream &operator<<(QDataStream &out,const QPerson &per)
  11. {
  12. out<<per.age<<per.name;
  13. return out;
  14. }
  15. /**
  16. *@brief 重载自定义对象的输出
  17. */
  18. inline QDataStream &operator>>(QDataStream &in,QPerson &per)
  19. {
  20. int age;
  21. QString name;
  22. in>>age>>name;
  23. per.age=age;
  24. per.name=name;
  25. return in;
  26. }
  27. /**
  28. * @brief QBuffer能处理QT自定义类型
  29. */
  30. void testQBuffer()
  31. {
  32. QByteArray ba;
  33. ba.resize(2*sizeof(QPerson));
  34. QBuffer buffer(&ba);
  35. buffer.open(QIODevice::WriteOnly);
  36. //输入
  37. QDataStream out(&buffer);
  38. for(int i=0;i<2;i++)
  39. {
  40. QPerson per;
  41. per.age=20+i;
  42. per.name=QString("sun_%1").arg(i+1);
  43. out<<per;
  44. }
  45. buffer.close();
  46. //输出
  47. QBuffer buf(&ba);
  48. buf.open(QIODevice::ReadOnly);
  49. QDataStream in(&buf);
  50. for(int i=0;i<2;i++)
  51. {
  52. QPerson per;
  53. in>>per;
  54. qDebug()<<per.age<<"---"<<per.name;
  55. }
  56. buf.close();
  57. }

QT: QByteArray储存二进制数据(包括结构体,自定义QT对象)的更多相关文章

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

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

  2. TCP/IP各种数据包结构体

    下面这些TCP/IP数据包是我在进行Socket及Wipcap网络编程过程中曾经用到过的数据包结构体, 这些东西平时看起来不起眼,真正用到的时候就会觉得非常有用...... 以太帧头格式结构体,共14 ...

  3. std::map使用结构体自定义键值

    使用STL中的map时候,有时候需要使用结构题自定义键值,比如想统计点的坐标出现的次数 struct Node{ int x,y; }; ...... map<Node,int>mp; m ...

  4. tableview setData 设置数据(结构体对象)

    定义设置的对象类型 Q_DECLARE_METATYPE(LISTITEMDATA *) 设置数据类型 LISTITEMDATA *ptask = &(const_cast<LISTIT ...

  5. Codeblock代码提示自动补全(包括结构体成员)

    转:https://blog.csdn.net/haibin8473/article/details/79113650

  6. 题目1013:开门人和关门人(结构体自定义cmp排序)

    题目链接:http://ac.jobdu.com/problem.php?pid=1013 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...

  7. swift 类 与 结构体

    这两天突然有人问我  swift里面 类和 结构体  有什么区别? 说实在的本人目前不太看好swift,相信很多人也是,oc 都 很成熟了. 本人目前不打算深入了解swift的原因swift  语言 ...

  8. 1.0 基础、标示符、常量、数据类型(enum 枚举,struct 结构体)、操作符、循环、数组

    一.程序 现实生活中,程序是指完成某些事务的一种既定方法和过程,可以把程序看成是一系列动作执行过程的描述. 在计算机世界,程序是指令,即为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集 ...

  9. Swift 学习笔记 (类和结构体)

    类和结构体是一种多功能且灵活的构造体.通过使用与现存常量 变量 函数完全相同的语法来在类和结构体中定义属性和方法以添加功能. Swift中不需要你为自定义的类和结构体创建独立的结构和实现文件.在Swi ...

随机推荐

  1. 银行卡luhm校验算法

    /** * 15位银行卡luhm校验算法 * 1.从卡号最后一位数字开始,逆向将奇数位(1.3.5等等)相加. * 2.从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去 ...

  2. 如何在Azure Websites中配置PHP从而改变系统默认时区

    Shirley_Wang  Tue, Mar 3 2015 7:29 AM Azure Website为我们提供了可高度扩展的网站部署平台.由于Website是PaaS(平台即服务)层的服务,当用户把 ...

  3. 从linux启动到rootfs的挂载分析

    简单的来说,根文件系统包括虚拟根文件系统和真实根文件系统.在Kernel启动的初始阶段,首先去创建虚拟的根文件系统,接下来再去调用do_mount来加载真正的文件系统,并将根文件系统切换到真正的文件系 ...

  4. (转载)php如何判断IP为有效IP地址

    (转载)http://www.kuitao8.com/20130918/1376.shtml 多数人看到这篇日志,第一印象肯定是以为是要讲如何通过正则表达式来判断. 非也,在php5.2.0之后,有专 ...

  5. 记录一次Jmeter性能测试

    一.引言 之前有总结过如何写Java请求测试用例类,写完测试脚本调通之后,信心满满地以为我准备好可以开始性能测试了.结果在评审测试计划的时候,当即被项目组狠狠的扇了一耳光,各种不确定的点:性能指标不明 ...

  6. vs2013 报错AccessViolationException 解决方案

    最近 用vs2013 vs2010开发一个web 项目的时候  报AccessViolationException 异常 ,找不到原因 后边网上看了解决方法,试了一下 解决了,具体什么原因搞不清. 下 ...

  7. JVM的GC机制及JVM的调优方法

    内存管理和垃圾回收是JVM非常关键的点,对Java性能的剖析而言,了解内存管理和垃圾回收的基本策略非常重要. 1.在程序运行过程当中,会创建大量的对象,这些对象,大部分是短周期的对象,小部分是长周期的 ...

  8. [原创]使用命令行工具提升cocos2d-x开发效率(二)之CocosBuilder篇

    如果你正在使用CocosBuilder或者是其他基于CocosBuilder源码改装而成的工具为你的游戏搭建场景或者UI,那你一定要看看这篇文章:)   你是否已经厌倦了无聊的手工publish操作? ...

  9. VS2013 :IntelliSense: 不允许使用不完整的类型

    出现上述情况,一般是存在对应的头文件,但是没有引用造成的. 引用的时候要注意头文件的顺序, 本项目中的头文件一般先引入,也就是用双引号#include "xxx.h",然后是系统中 ...

  10. activemq 异步和同步接收

    来点实在的代码,用例子来说明: 1.异步接收,主要设置messageListener.,然后编写onmessage方法,很简单 a.客户端发送5条消息 package ch02.chat; impor ...