因为利用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();
}
分享到:
相关推荐
`QByteArray`是QT中的一个动态字节数组,可以存储任何类型的数据,包括二进制数据。 ```cpp QByteArray data = file.readAll(); ``` 读取完文件后,我们需要将`QByteArray`转换为二进制表示形式。这可以通过遍历...
总结来说,QT通过TCP发送和接收自定义结构体的关键步骤包括:结构体的序列化和反序列化、建立和管理TCP连接、以及错误处理。利用QT提供的QDataStream和QTcpSocket类,我们可以轻松实现高效、可靠的网络通信。
在Qt框架中,读写二进制文件是一种高效且安全的数据存储方法,尤其适用于处理大量结构化数据。本文将深入探讨如何使用Qt的QDataStream类来实现二进制文件的读写操作,并结合自定义数据结构`AccountInfo`进行演示。 ...
这里,我们使用的`QDataStream`非常适合这种任务,因为它允许以特定的字节序读取和写入各种数据类型,包括整型、浮点型以及自定义结构体等。 至于“read_txt_udp”,这可能是另一个项目或文件名,可能与UDP(User ...
QByteArray则是一个字节数组,常用于存储二进制数据,如网络传输的数据包。int和double是C++标准库中的基本数值类型。 1. int或double转QString: 当需要将整型或浮点型数值显示为文本时,可以使用QString的构造...
由于C++标准库中并没有直接提供将整数转换为二进制字符串的函数,程序员往往需要自定义函数来完成这一过程。这里我们将讨论如何在Linux环境下,特别是在QT开发环境中,实现这一功能。 首先,我们来看标题提到的"int...
QFile::open()函数用于打开文件,然后QFile::read()可以用来读取二进制数据,这些数据通常会被转换成QByteArray对象,以便进一步处理。 3. **.bin文件**:.bin文件是二进制文件,通常包含机器代码或者原始数据,不...
在工作中,经常会使用二进制文件(.dat),但是对于不同的结构存储方式不一样。 每次拿着手指头一个个数着数字和字母,不仅累眼睛还疼。 针对同一个结构体存储数据,自己写了一个简单的解析工具, 代码中的结构体...
总结,QT编程中处理下位机的16进制数据主要包括数据接收、解析、转换及显示四个步骤。通过QLineEdit控件,我们可以直观地在界面上呈现这些数据,为用户提供友好的交互体验。理解这些知识点对于任何涉及硬件通信和...
可以获取textEdit上的QString类型16进制数转换为ByteArray; 输入数据错误判断及提示; CRC16校验计算公式; 计算ByteArray的crc16结果; 结果转换为QString,并且每两位数据都需要增加空格展示; 输入清除功能; ...
在QT4中,可以使用`QTextStream`的`setBase(16)`将十进制转换为十六进制,或者使用`QByteArray`的`toHex()`函数将字节数据转换为十六进制字符串。 在给定的项目文件中,我们看到有以下几个关键文件: - `mainwindow...
在Qt中实现十进制、二进制、十六进制之间的转换,你可以通过Qt的核心库(主要是QString和QByteArray类)来方便地完成。这里提供一个简单的示例,说明如何在Qt应用程序中实现这些转换。在Qt中实现十进制、二进制、...
综上所述,"QT打开二进制文件,串口分包定时发送源码.zip"的内容可能包含了以下部分:使用QT的QFile和QByteArray处理二进制文件,QSerialPort进行串口通信,QTimer实现定时发送,以及可能涉及的多线程编程。...
十六进制字符串转换为浮点数相对复杂,因为浮点数在计算机内部是以二进制的科学记数法存储的,涉及到浮点数的表示标准,如IEEE 754。我们可以先将十六进制字符串转换为整型,然后通过浮点数的二进制表示来完成转换:...
它是用于二进制数据的简单编辑器,就像QPlainTextEdit用于文本数据一样。 其中包含sip配置文件,因此很容易为PyQt创建绑定,您也可以在python 2和3中使用此小部件。 QHexEdit接收QByteArray(setData())的数据...
这是最直接的方法之一,通过`QByteArray::fromRawData`函数,可以直接将`qint32`变量的内存地址作为参数传入,从而创建一个包含该变量原始二进制数据的`QByteArray`对象。具体代码如下: ```cpp qint32 x = 42; // ...
本文主要探讨了在Qt中如何进行UTF8、Unicode、GBK、ASCII、16进制字符和16进制数值之间的转换。 首先,让我们简单回顾一下各种编码格式: - ASCII:美国信息交换标准代码,包含128个字符,主要用于英文和西欧语言,...
在QT编程环境中,TCP Socket(套接字)是用来在网络间进行数据传输的一种工具,而"qttcpsocket传送结构体"是指使用QT库中的QTcpSocket类来发送和接收自定义的结构体数据。QTcpSocket类是QNetworkAccessManager的一...