因为利用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();
}
分享到:
相关推荐
可以获取textEdit上的QString类型16进制数转换为ByteArray; 输入数据错误判断及提示; CRC16校验计算公式; 计算ByteArray的crc16结果; 结果转换为QString,并且每两位数据都需要增加空格展示; 输入清除功能; ...
2.首先来两个int类型的数据(或double型): 4.将int型(double型)转换为QByteArray型: 5.QString与QByteArray之
它是用于二进制数据的简单编辑器,就像QPlainTextEdit用于文本数据一样。 其中包含sip配置文件,因此很容易为PyQt创建绑定,您也可以在python 2和3中使用此小部件。 QHexEdit接收QByteArray(setData())的数据...
这是Qt小部件,用于以传统的十六进制编辑器样式显示二进制数据。 该小部件没有任何编辑功能。 仅查看和复制。 图形用户界面 建立例子 光盘QHexView mkdir构建 光盘制作 qmake ../example/qhexview.pro 制作 用法 ...
参数QByteArray的校验ModbusCRC16
做这个转换每每耗费很多时间,分大小端写了两个函数,测试正确,记录一下,以后直接就用了,也分享给有需要的小伙伴
Qt4实现 qint32到QByteArray的转换
QDB2_qbytearry删除_QByteArray删除_qbytearray截取_测试QBYTEARRAY.zip
/* 内有QT例程, ... * QT的 QByteArray 用 ZByteArray代替,其实是 std::vector; * 代码大部份沿用QT的编写方式,其中添了 setCallbackCalculaInterface 函 * 数,是为了方便使用其它压缩算法时的一个接口; */
简单测试QT C++ QByteArray 默认值在debug与release下的差异 默认值 debug模式是值CD release模式下是 随机数
Qt——txt文件选择、读取与写入 - CSDN博客 https://blog.csdn.net/qq_35451572/article/details/82630059
这里提供两种加解密的方法。 第一种方法:使用QByteArray的toBase64和fromBase64来实现。 第二种方法:使用base64.cpp文件中的base64_encode和base64_decode来实现。
Qt 中使用QJsonObject、QJsonArray生成与解析文件作为基础可以任意组合需要样式(博客中贴出代码,下载前看是否适合),这个积分是系统自己定的,不值这么多,之前有个小伙伴下载,可以给我留言想办法退给你;...
QTextCodec 字符编码与16进制数据转换 QTextCodec *codec = QTextCodec::codecForName("KOI8-R"); QString string = codec->toUnicode(encodedString); QByteArray encodedString = codec->fromUnicode(string);
QByteArray完美数据类型转换成uchar uint8_t,核心代码代码就三行,但是非常好用。Linux和windows下均测试通过
Qt绘制的自定义电压表,可测电压为0-500v,可自行修改量程和分辨率,源码下载编译
QDB2_qbytearry删除_QByteArray删除_qbytearray截取_测试QBYTEARRAY_源码.zip
采用UDP通信的Qt程序,当接收方与发送方正常连接发送报文后,本地定时器自动发送,当中断发送方发送时,接收方仍然有空报文接收到: 接收报文原程序: QByteArray datagram; datagram.resize(udpSocket->...
用到了联合体,更方便的将16进制数转换成浮点数,发送数据的时候,将QString 转换成16进制的QByteArray。更加方便发送。用到QDataStream 读取串口传来的2进制数, ds.setByteOrder(QDataStream::LittleEndian);设置...