因为利用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. Bootstrap 源码解析(转)

    1.Bootstrap的作用域 2.Bootstrap的类定义 3.Bootstrap的插件定义 4.Bootstrap的事件代理 5.Bootstrap的对象数据缓存 6.Bootstrap的防冲突 ...

  2. 【Java基础之容器】Iterator

    Iterator: ->所有实现了Collection接口的容器类都有一个iterator方法用以返回一个实现了Iterator接口的对象 ->Iterator对象称作迭代器,用以方便的实 ...

  3. 【转】AngularJS路由和模板

    1. AngularJS路由介绍 AngularJS路由功能是一个纯前端的解决方案,与我们熟悉的后台路由不太一样.后台路由,通过不同的URL会路由到不同的控制器上(controller),再渲染(re ...

  4. Android学习系列(1)--为App签名(为apk签名)

    写博客是一种快乐,前提是你有所写,与人分享,是另一种快乐,前提是你有舞台展示,博客园就是这样的舞台.这篇文章是android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用. 1.签 ...

  5. Oracle 参数化更新数据时报错:Oracle ORA-01722: 无效数字

    报错:Oracle ORA-01722: 无效数字 看了一篇博客,据说是参数与列名不能一致,改过之后还是报一样的错误:Oracle ORA-01722: 无效数字 ,后来试了一下,不是参数名必须不一样 ...

  6. android广告平台介绍

    广告模式:   广告条:最普遍的广告模式,嵌入在应用界面内,用户点击行为会带来收入.   积分墙:应用通过限制功能.去广告等引导用户进入积分墙页面下载广告应用得到积分来换取使用的模式,用户安装完推荐广 ...

  7. 在 MacOS 上编译链接 OpenGL 程序

    几个星期以前开始折腾在我的MBA上写 OpenGL 小程序.我不太熟悉MacOS上的开发工具比如XCode,所以一开始的想法就是用vim来写程序,然后手工编译链接.网上查了一下,MacOS上的Open ...

  8. MFC消息映射机制

    1.MFC应用框架主要类之间的关系 MFC自动生成的框架中重要的类有:C-App.CMainFrame.C-Doc和C-View. 其他的类如CClassView.CFileView等都是在框架窗口( ...

  9. sqlserver 出现 因为文件组 'PRIMARY' 已满 的解决办法 有可能是磁盘剩余空间不足 导致的

    一般虚拟主机提供商是通过限制数据库文件的大小来实现提供定制的数据库空间的.当你把从虚拟数据库空间备份下来的文件恢复到自己的服务器上时,这个限制还是存在的.找到数据库文件 给增加个数据文件就好了 解决办 ...

  10. python app progs