Qt中的QByteArray使用注意事项
在网络编程中,QT的QByteArray比较常用,好用之处在于:
1、QByteArray本身提供了大量操作函数;
2、QByteArray还可以借助QDataStream,进行<<和>>操作,更方便;
3、QUdpSocket或QTcpSocket的发送、接收时,使用QByteArray进行拼包、拆包、处理字节序很方便。
一、典型代码
发送端:
void winSimMain::sendDatagram() { uchar d[] = {0x02, 0x00, 0x01, 0x00, 0x01, 0x00,0x00,0x00,0xC9, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x01,0x01 }; QByteArray dat((char*)d,31); QByteArray r1 = utilArray::Int32ToByteArray(rand(),QDataStream::BigEndian); dat.replace(9,4,r1); QByteArray r2 = utilArray::Int32ToByteArray(rand(),QDataStream::BigEndian); dat.replace(13,4,r2); QByteArray r3 = utilArray::Int32ToByteArray(rand(),QDataStream::BigEndian); dat.replace(17,4,r3); QByteArray r4 = utilArray::Int32ToByteArray(rand(),QDataStream::BigEndian); dat.replace(21,4,r4); QByteArray r5 = utilArray::Int32ToByteArray(rand(),QDataStream::BigEndian); dat.replace(25,4,r5); qDebug() << dat; udpSocket.writeDatagram(dat, QHostAddress::LocalHost, 15000); }
接收端:
void winMain::processPendingDatagrams() { QHostAddress ip; quint16 port; QByteArray datagram; do { datagram.resize(udpSocket.pendingDatagramSize()); udpSocket.readDatagram(datagram.data(), datagram.size(),&ip, &port); if(datagram.length() < 3) { continue; } uchar cmd = datagram[0]; //命令字 switch(cmd) { case 0x01: //刷卡通知 { uchar* dat = (uchar*)datagram.data(); ushort tmp = dat[1]; tmp = (tmp << 8) + dat[2]; //终端号 } break; default: break; } } while (udpSocket.hasPendingDatagrams()); }
二、注意事项
发送端:注意缓冲区是uchar[]类型,而QByteArray要求char[]类型,做一个强制转换即可。
接收端:需要注意的仍然是char和byte的区分问题,特别是若有类似操作:
uchar* dat = (uchar*)ba.data(); ushort tmp = dat[1]; tmp = (tmp << 8) + dat[2]; //终端号 return tmp;
中,若dat[2]是char,则造成byte+char的现象,会导致比较难易发现的逻辑错误。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!