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


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

    //自定义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();  
        }  
    

     

     

  • 相关阅读:
    贡献15本经典C、C++、MFC、VC++教程,都是pdf完整版的
    雪花
    孙鑫C++视频教程 rmvb格式 全20CD完整版 精品分享
    mac上用VMWare虚拟机装win7
    阿里云如何解析域名,搭建云服务器环境
    2. Windows编程基础
    复制指定目录下的全部文件到另一个目录中
    Select查询命令
    使用OneNote2016发送博客
    Linux数字雨
  • 原文地址:https://www.cnblogs.com/wlzy/p/6801862.html
Copyright © 2020-2023  润新知