QT: QByteArray储存二进制数据(包括结构体,自定义QT对象)
2014-07-09 08:51
330 查看
因为利用QByteArray可以很方便的利用其API对内存数据进行访问和修改, 构建数据库blob字段时必不可少; 那如何向blob内写入自定义的结构体和类
1. 利用memcpy拷贝内存数据
//自定义person结构体
Cpp代码
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自定义结构体
Cpp代码
//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();
}
1. 利用memcpy拷贝内存数据
//自定义person结构体
Cpp代码
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自定义结构体
Cpp代码
//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();
}
相关文章推荐
- QT: QByteArray储存二进制数据(包括结构体,自定义QT对象)
- QByteArray储存二进制数据(包括结构体,自定义QT对象)
- QByteArray储存二进制数据(包括结构体,自定义QT对象)
- QByteArray储存二进制数据(包括结构体,自定义QT对象)
- QT:用QSet储存自定义结构体的问题——QSet和STL的set是有本质区别的,QSet是基于哈希算法的,要求提供自定义==和qHash函数
- QT:用QSet储存自定义结构体的问题
- QT:用QSet储存自定义结构体的问题
- QT:用QSet储存自定义结构体的问题
- 自定义可绑定数据的业务对象实体和强类型-Part Three
- SQLSERVER2000下生成数据库对象脚本(不包括数据信息)
- 自定义可绑定数据的业务对象实体和强类型-Part Four
- 与DotNet数据对象结合的自定义数据对象设计 (二) 数据集合与DataTable
- 与DotNet数据对象结合的自定义数据对象设计 (二) 数据集合与DataTable
- qt中读写二进制数据的问题
- 我要从com向应用程序返回一个结构,结构中包括二进制数据,请问用什么方式传替比较好呢?BSTR,VARIANT还是其他什么类型比较好呢
- 自定义可绑定数据的业务对象实体和强类型-Part Two
- 自定义可绑定数据的业务对象实体和强类型-Part One
- 复杂自定义数据对象绑定到GridView的问题
- qt4:二进制数据的读和写
- 一个操作共享内存的类!可以方面的添加,删除数据,包括各种结构体!