`
tcspecial
  • 浏览: 911451 次
  • 性别: 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  
经常看看您的帖子,把它当成教科书,范本来学习。

相关推荐

    QT开发-文件(所有)读取-转二进制

    `QByteArray`是QT中的一个动态字节数组,可以存储任何类型的数据,包括二进制数据。 ```cpp QByteArray data = file.readAll(); ``` 读取完文件后,我们需要将`QByteArray`转换为二进制表示形式。这可以通过遍历...

    QT通过Tcp发送接收自定义结构体

    总结来说,QT通过TCP发送和接收自定义结构体的关键步骤包括:结构体的序列化和反序列化、建立和管理TCP连接、以及错误处理。利用QT提供的QDataStream和QTcpSocket类,我们可以轻松实现高效、可靠的网络通信。

    Qt-读写二进制文件(数据结构)

    在Qt框架中,读写二进制文件是一种高效且安全的数据存储方法,尤其适用于处理大量结构化数据。本文将深入探讨如何使用Qt的QDataStream类来实现二进制文件的读写操作,并结合自定义数据结构`AccountInfo`进行演示。 ...

    Qt 读取16进制的data文件

    这里,我们使用的`QDataStream`非常适合这种任务,因为它允许以特定的字节序读取和写入各种数据类型,包括整型、浮点型以及自定义结构体等。 至于“read_txt_udp”,这可能是另一个项目或文件名,可能与UDP(User ...

    Qt中QString、QByteArray、int、double之间转换 - 苦涩的茶 - 博客园1

    QByteArray则是一个字节数组,常用于存储二进制数据,如网络传输的数据包。int和double是C++标准库中的基本数值类型。 1. int或double转QString: 当需要将整型或浮点型数值显示为文本时,可以使用QString的构造...

    linux下int转二进制字符串的方法_int转二进制字符串的方法_QT_linux_

    由于C++标准库中并没有直接提供将整数转换为二进制字符串的函数,程序员往往需要自定义函数来完成这一过程。这里我们将讨论如何在Linux环境下,特别是在QT开发环境中,实现这一功能。 首先,我们来看标题提到的"int...

    QT打开二进制文件,串口分包定时发送

    QFile::open()函数用于打开文件,然后QFile::read()可以用来读取二进制数据,这些数据通常会被转换成QByteArray对象,以便进一步处理。 3. **.bin文件**:.bin文件是二进制文件,通常包含机器代码或者原始数据,不...

    QT之解析二进制文件(.dat)的实现

    在工作中,经常会使用二进制文件(.dat),但是对于不同的结构存储方式不一样。 每次拿着手指头一个个数着数字和字母,不仅累眼睛还疼。 针对同一个结构体存储数据,自己写了一个简单的解析工具, 代码中的结构体...

    QT 收到下位机16进制数转换字符串显示

    总结,QT编程中处理下位机的16进制数据主要包括数据接收、解析、转换及显示四个步骤。通过QLineEdit控件,我们可以直观地在界面上呈现这些数据,为用户提供友好的交互体验。理解这些知识点对于任何涉及硬件通信和...

    CRC16的demo程序-QString类型16进制转换为ByteArray-每两位数据增加空格

    可以获取textEdit上的QString类型16进制数转换为ByteArray; 输入数据错误判断及提示; CRC16校验计算公式; 计算ByteArray的crc16结果; 结果转换为QString,并且每两位数据都需要增加空格展示; 输入清除功能; ...

    QT4进制转换、十六进制

    在QT4中,可以使用`QTextStream`的`setBase(16)`将十进制转换为十六进制,或者使用`QByteArray`的`toHex()`函数将字节数据转换为十六进制字符串。 在给定的项目文件中,我们看到有以下几个关键文件: - `mainwindow...

    qt实现进制转换,包括十进制、二进制、十六进制

    在Qt中实现十进制、二进制、十六进制之间的转换,你可以通过Qt的核心库(主要是QString和QByteArray类)来方便地完成。这里提供一个简单的示例,说明如何在Qt应用程序中实现这些转换。在Qt中实现十进制、二进制、...

    QT打开二进制文件,串口分包定时发送源码.zip

    综上所述,"QT打开二进制文件,串口分包定时发送源码.zip"的内容可能包含了以下部分:使用QT的QFile和QByteArray处理二进制文件,QSerialPort进行串口通信,QTimer实现定时发送,以及可能涉及的多线程编程。...

    十六进制字符串到浮点数,整型的相互转换源代码(qt+vc2010)

    十六进制字符串转换为浮点数相对复杂,因为浮点数在计算机内部是以二进制的科学记数法存储的,涉及到浮点数的表示标准,如IEEE 754。我们可以先将十六进制字符串转换为整型,然后通过浮点数的二进制表示来完成转换:...

    qhexedit2:Qt的二进制编辑器

    它是用于二进制数据的简单编辑器,就像QPlainTextEdit用于文本数据一样。 其中包含sip配置文件,因此很容易为PyQt创建绑定,您也可以在python 2和3中使用此小部件。 QHexEdit接收QByteArray(setData())的数据...

    Convert from qint32 to qbytearray

    这是最直接的方法之一,通过`QByteArray::fromRawData`函数,可以直接将`qint32`变量的内存地址作为参数传入,从而创建一个包含该变量原始二进制数据的`QByteArray`对象。具体代码如下: ```cpp qint32 x = 42; // ...

    Qt中的字符编码转换:UTF8、Unicode、GBK、ASCII、16进制字符、16进制数值

    本文主要探讨了在Qt中如何进行UTF8、Unicode、GBK、ASCII、16进制字符和16进制数值之间的转换。 首先,让我们简单回顾一下各种编码格式: - ASCII:美国信息交换标准代码,包含128个字符,主要用于英文和西欧语言,...

    qttcpsocket传送结构体

    在QT编程环境中,TCP Socket(套接字)是用来在网络间进行数据传输的一种工具,而"qttcpsocket传送结构体"是指使用QT库中的QTcpSocket类来发送和接收自定义的结构体数据。QTcpSocket类是QNetworkAccessManager的一...

Global site tag (gtag.js) - Google Analytics