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