在網絡編程中,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的現象,會導致比較難易發現的邏輯錯誤。
