本文主要是介绍QByteArray储存二进制数据(包括结构体,自定义QT对象),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
因为利用QByteArray可以很方便的利用其API对内存数据进行访问和修改, 构建数据库blob字段时必不可少; 那如何向blob内写入自定义的结构体和类
1. 利用memcpy拷贝内存数据
//自定义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()<<person->age<<"---"<<person->name;person++;qDebug()<<person->age<<"---"<<person->name;
}
memcpy只能处理字段为基本类型的结构体, 当使用QString name, 我用person->name去访问其值, 程序崩溃; 由此可见,内存数据无法还原构建成QString类. 如果要写入自定的QT类, 只能借助QBuffer了, 通过二进制流写入
2. QBuffer写入QT自定义结构体
//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();
}
这篇关于QByteArray储存二进制数据(包括结构体,自定义QT对象)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!