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的现象,会导致比较难易发现的逻辑错误。

posted @   张疯牛  阅读(12012)  评论(0编辑  收藏  举报
编辑推荐:
· 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框架的用法!
石家庄坦图计算机科技有限公司 石家庄市丰收路220号泽润大厦17层
点击右上角即可分享
微信分享提示