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

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

//自定义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()<age<name;

person++;

qDebug()<age<name;

}

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

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

//QBuffer序列化自定义对象

typedef struct

{

int age;

QString name;

}QPerson;

/**

*@brief 重载自定义对象的输入

*/

inline QDataStream &operator<

{

out<

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<

}

buffer.close();

//输出

QBuffer buf(&ba);

buf.open(QIODevice::ReadOnly);

QDataStream in(&buf);

for(int i=0;i<2;i++)

{

QPerson per;

in>>per;

qDebug()<

}

buf.close();

}

QT&colon; QByteArray储存二进制数据&lpar;包括结构体&comma;自定义QT对象&rpar;

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

TCP&sol;IP各种数据包结构体

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

std&colon;&colon;map使用结构体自定义键值

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

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

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

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

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

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

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

golang 自定义结构体&lpar;与其他语言对象类似&rpar;

/* 结构体变量: 结构体的定义只是一种内存布局的描述,只有当结构体实例化时,才会真正地分配内存, 因此必须在定义结构体并实例化后才能使用结构体的字段. type 类型名 struct { 字段1 字 ...

swift 类 与 结构体

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

1&period;0 基础、标示符、常量、数据类型&lpar;enum 枚举&comma;struct 结构体&rpar;、操作符、循环、数组

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

随机推荐

python动态创建类的声明

动态创建类的声明 使用内置函数type,原型:class type(name, bases, dict)name是类的名字,相当于__class__bases是类的基类,元组,可以有多个基类,但是基类 ...

&lbrack;Asp&period;net 5&rsqb; DependencyInjection项目代码分析4-微软的实现(1)

前面俩种实现中,很多内部细节都无法知道,微软的框架也是为了屏蔽具体实现,只让我们关注接口.但是人都是充满好奇的,依赖注入到底是怎么实现的呢? 微软又有怎样的实现呢?下面就为大家一一呈现(说实话,代码真 ...

loadrunner中切割strtok字符串

http://blog.sina.com.cn/s/blog_7ee076050102vamg.html http://www.cnblogs.com/lixiaohui-ambition/archi ...

flex 布局 实现电商网页菜单的多级分类展示

用flex,实现多级菜单分类展示,这里记录一下,方便以后查阅. 效果展示如下: 跟上面floor的设计差不多,鼠标hover全部商品分类的时候,将下拉列表展示在指定区域,这个类似鼠标悬浮商品图片期待上 ...

《http权威指南》读书笔记7

概述 最近对http很感兴趣,于是开始看.别人都说这本书有点老了,而且内容太多.我个人觉得这本书写的太好了,非常长知识,让你知道关于http的很多概念,不仅告诉你怎么做 ...

Linux文件权限与属性详解 之 一般权限

目录 一般属性 1. iNode: 3152621 2. 文件类型 3.文件访问权限 4. 链接数目: 5. 文件所有者 6. 文件所属组 7. 文件大小 8. 修改时间 9. 文件名称 Linux文 ...

Node&period;js之mysql增删改查

1.安装库 npm install mysql 2.编写db.js(用作公共模块) //连接MySQL数据库 var mysql = require("mysql"); var p ...

servlet篇 之 servlet的访问

三:servlet的访问 使用web.xml文件中的这个标签中的映射路径,来访问servlet 6.1 在浏览器的地址栏中,直接输入servlet映射的路径来访问 ...

Jupyter&sol;JupyterLab安装使用

一.介绍 Jupyther notebook(曾经的Ipython notebook),是一个可以把代码.图像.注释.公式和作图集于一处,实现可读性及可视化分析的工具,支持多种编程语言.官方使用手册. ...

ImageButton设置src图片大小

需求&起因 有时候没有找到合适大小的资源,需要修改图片大小而且不改变ImageButton的大小.可以通过缩放图片大小的方式改变外观. ImageView的属性android:scaleTyp ...

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值