因为利用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根目录下的文件或文件夹

    原文网址:http://my.oschina.net/Ccx371161810/blog/287823 读取android根目录下的文件或文件夹 SDK的操作 读取android根目录下的文件或文件夹 ...

  2. [开发工具] 史上最全系列之开发环境搭建之DDMS

    原文链接:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=275774 一.简介 DDMS 的全称是DalvikDebug Mon ...

  3. jQuery基础知识— 获得内容和属性

    jQuery拥有可操作HTML元素和属性的方法.   获得内容: text()--设置或返回所选元素的文本内容 html()--设置或返回所选元素的内容(包括HTML标记) val()--设置或返回表 ...

  4. C# using SendMessage, problem with WM_COPYDATA z

    The final missing piece depends on if you are using any processor, x86 or x64. The details using the ...

  5. HDU 5965 Gym Class 贪心+toposort

    分析:就是给一些拓补关系,然后求最大分数,所以贪心,大的越靠前越好,小的越靠后越好 剩下的就是toposort,当然由于贪心,所以使用优先队列 #include <iostream> #i ...

  6. codeforces 672C - Recycling Bottles 贪心水题

    感觉很简单,就是讨论一下 #include <stdio.h> #include <string.h> #include <algorithm> #include ...

  7. EF5.0修改实体的时候,出现“对一个或多个实体的验证失败。有关详细信息,请参见“EntityValidationErrors”属性这个错误

    对于这个错误,要在SaveChanges前关闭验证实体有效性(ValidateOnSaveEnabled)这个开关 db.Configuration.ValidateOnSaveEnabled = f ...

  8. LeetCode题解——Longest Palindromic Substring

    题目: 给定一个字符串S,返回S中最长的回文子串.S最长为1000,且最长回文子串是唯一. 解法: ①遍历,对于每个字符,计算以它为中心的回文子串长度(长度为奇数),同时计算以它和右边相邻字符为中心的 ...

  9. 在Visual Studio中利用NTVS创建Pomelo项目

    刚看新闻,才知道微软发布了Node.js Tools for Visual Studio(NTVS),受够了WebStorm输入法Bug的困扰,这下终于可以解脱了.以Pomelo为例,运行命令:pom ...

  10. algorithm@ lower_bound implementation(Binary Search)

    一道来自jhu algorithm的作业题: Given two sorted arrays A, B, give a linear time algorithm that finds two entr ...