zoukankan      html  css  js  c++  java
  • QByteArray储存二进制数据(包括结构体,自定义QT对象)

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

    1. 利用memcpy拷贝内存数据

        //自定义person结构体

    Cpp代码  收藏代码
    1. typedef struct  
    2. {  
    3.     int age;  
    4.     char name[20];  
    5. }Person;  
    6.   
    7. //向QByteArray写入多个结构体  
    8. void writeStruct()  
    9. {  
    10.     QByteArray ba;  
    11.     ba.resize(2*sizeof(Person)); //设置容量  
    12.   
    13.     //序列化  
    14.     for(int i=0;i<2;i++)  
    15.     {  
    16.         Person p1;  
    17.         p1.age=10+i;  
    18.     strcpy(p1.name,"javaeye");  
    19.         memcpy(ba.data()+i*sizeof(Person),&p1,sizeof(Person)); //指针移动,写入多个数据  
    20.     }  
    21.   
    22.     //还原数据  
    23.     Person *person=(Person*)ba.data();  
    24.     qDebug()<<person->age<<"---"<<person->name;  
    25.   
    26.     person++;  
    27.     qDebug()<<person->age<<"---"<<person->name;  
    28. }  

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

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

    Cpp代码  收藏代码
    1. //QBuffer序列化自定义对象  
    2. typedef struct  
    3. {  
    4.     int age;  
    5.     QString name;  
    6. }QPerson;  
    7.   
    8. /** 
    9.  *@brief 重载自定义对象的输入 
    10.  */  
    11. inline QDataStream &operator<<(QDataStream &out,const QPerson &per)  
    12. {  
    13.     out<<per.age<<per.name;  
    14.     return out;  
    15. }  
    16.   
    17. /** 
    18.  *@brief 重载自定义对象的输出 
    19.  */  
    20. inline QDataStream &operator>>(QDataStream &in,QPerson &per)  
    21. {  
    22.     int age;  
    23.     QString name;  
    24.     in>>age>>name;  
    25.   
    26.     per.age=age;  
    27.     per.name=name;  
    28.     return in;  
    29. }  
    30.   
    31. /** 
    32.  * @brief QBuffer能处理QT自定义类型 
    33.  */  
    34. void testQBuffer()  
    35. {  
    36.     QByteArray ba;  
    37.     ba.resize(2*sizeof(QPerson));  
    38.   
    39.     QBuffer buffer(&ba);  
    40.     buffer.open(QIODevice::WriteOnly);  
    41.   
    42.     //输入  
    43.     QDataStream out(&buffer);  
    44.     for(int i=0;i<2;i++)  
    45.     {  
    46.         QPerson per;  
    47.         per.age=20+i;  
    48.         per.name=QString("sun_%1").arg(i+1);  
    49.         out<<per;  
    50.     }  
    51.     buffer.close();  
    52.   
    53.   
    54.     //输出  
    55.     QBuffer buf(&ba);  
    56.     buf.open(QIODevice::ReadOnly);  
    57.   
    58.     QDataStream in(&buf);  
    59.     for(int i=0;i<2;i++)  
    60.     {  
    61.       QPerson per;  
    62.       in>>per;  
    63.       qDebug()<<per.age<<"---"<<per.name;  
    64.     }  
    65.     buf.close();  
    66. }  
  • 相关阅读:
    ZJOI 2019 划水记
    【博弈论】浅谈泛Nim游戏
    HZNU ACM一日游 2019.3.17 【2,4,6-三硝基甲苯(TNT)】
    BZOJ 1008 越狱 组合数学
    BZOJ 1036 树的统计Count 树链剖分模板题
    BZOJ 1012 最大数maxnumber 线段树
    BZOJ 1001 狼抓兔子 平面图的最小割
    SGU---107 水题
    欧拉回路模板
    hdu-3397 Sequence operation 线段树多种标记
  • 原文地址:https://www.cnblogs.com/h2zZhou/p/9560124.html
Copyright © 2011-2022 走看看