• QT: 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()<age<<"---"<name;  
    25.   
    26.     person++;  
    27.     qDebug()<age<<"---"<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;  < span="">
    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;  < span="">
    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<<"---"
    64.     }  
    65.     buf.close();  
    66. }  

    原文:http://blog.chinaunix.net/uid-23381466-id-3896956.html

  • 相关阅读:
    V4L2摄像头应用编程(转)
    ok6410 3.0.1内核调用V4L接口出错解决方法(转)
    Salesforce学习之路(十一)Aura组件属性<aura:attribute />
    Salesforce学习之路(九)Org的命名空间
    Salesforce学习之路(八)一次拉取多个文件或全部文件至本地
    Salesforce学习之路(十)Aura组件工作原理
    Salesforce学习之路(七)Visualforce结合Reports展示图表
    Salesforce学习之路(六)利用Visualforce Page实现页面的动态刷新功能
    Salesforce学习之路(五)role hierarchy & sharing
    Salesforce学习之路(四)利用Jenkins和Git实现Salesforce的CI/CD功能
  • 原文地址:https://www.cnblogs.com/wnnily/p/4849161.html
Copyright © 2020-2023  润新知