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