`
tcspecial
  • 浏览: 895918 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

    博客分类:
  • 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();
}

 

分享到:
评论
3 楼 tadpole_java 2015-05-07  
环形缓冲区类(C++源码)绝对可用.....转到你网易的微博上了。这个东西还需要请教你。
2 楼 tcspecial 2015-04-23  
tadpole_java 写道
经常看看您的帖子,把它当成教科书,范本来学习。

谢谢,也就平时遇到一些问题,作下笔记了。希望不要误导大家
1 楼 tadpole_java 2015-04-22  
经常看看您的帖子,把它当成教科书,范本来学习。

相关推荐

Global site tag (gtag.js) - Google Analytics