因为利用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. 【转】android的消息处理机制(图+源码分析)——Looper,Handler,Message

    原文地址:http://www.cnblogs.com/codingmyworld/archive/2011/09/12/2174255.html#!comments 作为一个大三的预备程序员,我学习 ...

  2. android利用WebView实现浏览器的封装

    android提供了封装浏览器的接口,可以让开发者利用自己的view显示网页内容.今天又实现研究了一下,利用WebView显示浏览器内容,还可以利用 WebViewClient显示自己需要的内容. 参 ...

  3. mkimage的-a 和 –c参数和内核引导

    目录 一.mkimage工具简介二.-a参数与-e参数和内核引导的关系三.实例测试 3.1 -a参数与-e参数相同,可以将内核下载到SDRAM的任何地址,然后从这启动 3.2 -a参数与-e参数不同, ...

  4. ASCII编码:Linux&Windows

    我们的服务器为linux系统,日志中的字段通常会用不同分隔符来做分隔,在不同操作系统编码格式下查看也会有不同的体现,甚至会出现所谓的乱码.我在xshell5下常用的编码格式Unicode(UTF-8) ...

  5. Jquery+asp.net后台数据传到前台js进行解析的方法

    所以在解析后台数据的时候,我们需要根据后台的数据情况,特殊处理和对待. 我这里后台用的是asp.net提供的wcf服务,也有ashx一般处理程序.大致原理差不多. C#中我们经常用的对象,有实体对象比 ...

  6. pomelo环境搭建

    在ubuntu上搭建pomelo环境 一 安装node.js 不要直接安装nodejs, 因为ubuntu上默认的nodejs版本是0.6的太老千万不要下tar包自己安装, 问题很多正确方法如下:   ...

  7. FL2440移植u-boot2011.09

    u-boot version:2011.09-rc1 /home/lucas/u-boot-2011.09-rc1 OS:debian 7.1 cross-compilation chain:arm- ...

  8. 【HBase学习】Apache HBase 参考手册 中文版

    正在撰写,稍后来访……

  9. XMPP的Stanzas

    客户端需要使用JID作为身份标石 : [user "@"]domain["/"resource]加域名可以区别重名的用户user,resource可以区分用户登 ...

  10. Javascript and DOM学习

    1.输出 document.write.(); 2.alert警告 3.confirm消息对话框:当用户点击"确定"按钮时,返回true,取消时,返回false 4.prompt提 ...