首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

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

2012-09-16 
QByteArray储存二进制数据(包括结构体,自定义QT对象)???? 因为利用QByteArray可以很方便的利用其API对内存

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();}

?

热点排行