开源手机网站系统,触摸屏互动网站建设案例,做ppt什么网站图片好,wordpress文章列表1.大小端数据简介
大小端#xff08;Endianness#xff09;是计算机体系结构的一个术语#xff0c;它描述了多字节数据在内存中的存储顺序。以下是大小端的定义和它们的特点#xff1a;
大端#xff08;Big-Endian#xff09; 在大端模式中#xff0c;一个字的最高有效…1.大小端数据简介
大小端Endianness是计算机体系结构的一个术语它描述了多字节数据在内存中的存储顺序。以下是大小端的定义和它们的特点
大端Big-Endian 在大端模式中一个字的最高有效字节MSB即最左边的那位存储在最低的内存地址处而最低有效字节LSB即最右边的那位存储在最高的内存地址处。
例如假设有一个16位的数字 0x1234其在内存中的存储顺序如下
地址增加方向 --
[ 12 ] [ 34 ]其中 [12] 是高字节存储在低地址处[34] 是低字节存储在高地址处。
小端Little-Endian 在小端模式中情况正好相反一个字的最低有效字节存储在最低的内存地址处而最高有效字节存储在最高的内存地址处。
继续上面的例子16位的数字 0x1234 在小端模式下的存储顺序如下
地址增加方向 --
[ 34 ] [ 12 ]其中 [34] 是低字节存储在低地址处[12] 是高字节存储在高地址处。
2.小端数据收发
假设我们现在有一个UDP头的数据结构如下所示。 //UDP协议头typedef struct{quint16 type; //报文类型quint16 num; //报文序号取值范围为065535quint32 len; //报文长度quint16 srcAddr; //信源地址quint16 dstAddr; //信宿地址quint8 year; //发送时间 年份后两位 UTC时间quint8 month;quint8 day;quint8 hour;quint8 minute;quint8 second;}UdpHeader;数据发送组包。
QByteArray pack(const Protocol::UdpHeader header)
{QByteArray byte;byte.append((char*)(header.type),2);byte.append((char*)(header.num),2);byte.append((char*)(header.len),4);byte.append((char*)(header.srcAddr),2);byte.append((char*)(header.dstAddr),2);QString format yy-MM-dd-hh-mm-ss;QDateTime dateTime QDateTime::currentDateTime();dateTime.setTimeSpec(Qt::LocalTime);QDateTime utcTime dateTime.toUTC();QString strUtcTime utcTime.toString(format);QStringList timeList strUtcTime.split(-);quint8 year timeList.at(0).toInt();quint8 month timeList.at(1).toInt();quint8 day timeList.at(2).toInt();quint8 hour timeList.at(3).toInt();quint8 minute timeList.at(4).toInt();quint8 sec timeList.at(5).toInt();byte.append(year);byte.append(month);byte.append(day);byte.append(hour);byte.append(minute);byte.append(sec);return byte;
}数据接收拆包
void unPack(const QByteArray byte, Protocol::UdpHeader header)
{if(byte.size() ! UDP_HEADER_LEN){return;}memcpy(header,byte.data(),sizeof(Protocol::UdpHeader));
}3.大端数据收发
还是上面的头例子。 数据发送组包。 使用QDataStream类作为辅助设置setByteOrder为大端序列。
QByteArray packBigEndian(const Protocol::UdpHeader header)
{QByteArray byte;QDataStream stream(byte,QIODevice::WriteOnly);stream.setByteOrder(QDataStream::BigEndian);stream(header.type);stream(header.num);stream(header.len);stream(header.srcAddr);stream(header.dstAddr);QString format yy-MM-dd-hh-mm-ss;QDateTime dateTime QDateTime::currentDateTime();dateTime.setTimeSpec(Qt::LocalTime);QDateTime utcTime dateTime.toUTC();QString strUtcTime utcTime.toString(format);QStringList timeList strUtcTime.split(-);quint8 year timeList.at(0).toInt();quint8 month timeList.at(1).toInt();quint8 day timeList.at(2).toInt();quint8 hour timeList.at(3).toInt();quint8 minute timeList.at(4).toInt();quint8 sec timeList.at(5).toInt();streamyear;streammonth;streamday;streamhour;streamminute;streamsec;return byte;
}数据接收拆包。 对于多字节的数据都需要单独使用qToBigEndian转换为大端。
void unPackBigEndian(const QByteArray byte, Protocol::UdpHeader header)
{if(byte.size() ! UDP_HEADER_LEN){return;}memcpy(header,byte.data(),sizeof(Protocol::UdpHeader));header.type qToBigEndian(header.type);header.num qToBigEndian(header.num);header.len qToBigEndian(header.len);header.srcAddr qToBigEndian(header.srcAddr);header.dstAddr qToBigEndian(header.dstAddr);
}