您的位置:首页 > 编程语言 > Qt开发

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

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

1. 利用memcpy拷贝内存数据

//自定义person结构体

Cpp代码



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()<<person->age<<"---"<<person->name;

person++;

qDebug()<<person->age<<"---"<<person->name;

}

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

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

Cpp代码



//QBuffer序列化自定义对象

typedef struct

{

int age;

QString name;

}QPerson;

/**

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

*/

inline QDataStream &operator<<(QDataStream &out,const QPerson &per)

{

out<<per.age<<per.name;

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<<per;

}

buffer.close();

//输出

QBuffer buf(&ba);

buf.open(QIODevice::ReadOnly);

QDataStream in(&buf);

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

{

QPerson per;

in>>per;

qDebug()<<per.age<<"---"<<per.name;

}

buf.close();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: