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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM