Qt 实现网络数据报文大小端数据的收发

news/2024/11/24 20:43:15/

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;                //报文序号,取值范围为0~65535quint32 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();stream<<year;stream<<month;stream<<day;stream<<hour;stream<<minute;stream<<sec;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);
}

http://www.ppmy.cn/news/1549624.html

相关文章

使用Kotlin写一个将字符串加密成short数组,然后可以解密还原成原始的字符串的功能

文章目录 一、运行效果1.1 单个字符串加解密1.2 多个字符串数组加解密二、源代码2.1 控制流图2.2 实现的源代码一、运行效果 1.1 单个字符串加解密 待加密的单个字符串: 测试字符串转化成short数组-----字节卷动 单个字符串加密后的数据: [19914, -21676, 31702, 23463, 2833…

IP转发流程

IP 转发是网络通信中通过中间设备&#xff08;如路由器或启用了转发功能的主机&#xff09;将接收到的 IP 数据包根据路由表的指引发送到目标网络的过程。以下是 IP 转发的详细流程及转发过程中各个环节的说明&#xff1a; IP 转发的流程详解 数据包到达路由器或主机&#xff…

通过机器学习找关键因素

目录 1 什么是机器学习2 监督学习2.1 什么是监督学习2.2 监督学习的类别2.3 常见的监督学习算法2.3 监督学习应用场景 3 无监督学习3.1 无监督学习类别3.2 无监督学习算法3.3 无监督学习应用场景 4 强化学习5 环境安装5.1 python环境配置5.1.1 python下载和安装5.1.2 软件源配置…

11.19 机器学习-岭回归+拉索回归+逻辑回归

# 欠拟合 训练不够 # 过拟合 训练太够了 噪声也学进去了 # 一般来说w的值越大 误差越大 w的值小误差小 但也不能太小 不然失去了应用的意义 # 防止 欠拟合和过拟合的方式 就岭回归和拉索回归 正则化 # 本质上就是牺牲模型在训练集上的正确率来提高推广、泛化能力&#xff0…

30. 并发编程

一、什么是多任务 如果一个操作系统上同时运行了多个程序&#xff0c;那么称这个操作系统就是 多任务的操作系统&#xff0c;例如&#xff1a;Windows、Mac、Android、IOS、Harmony 等。如果是一个程序&#xff0c;它可以同时执行多个事情&#xff0c;那么就称为 多任务的程序。…

20221403郑骁恒-第十一周预习报告

AI对学习内容的总结 网络通信基础&#xff1a; 介绍了不同机器上的程序如何通过网络进行通信。强调了C语言在编写网络代码中的重要性&#xff0c;尤其是在低层次的网络编程中。 服务器和客户端&#xff1a; 解释了网络应用程序通常需要服务器和客户端两个独立的程序。通过一个…

AMD(Xilinx) FPGA配置Flash大小选择

目录 1 FPGA配置Flash大小的决定因素2 为什么选择的Flash容量大小为最小保证能够完成整个FPGA的配置呢&#xff1f; 1 FPGA配置Flash大小的决定因素 在进行FPGA硬件设计时&#xff0c;选择合适的配置Flash是我们进行硬件设计必须考虑的&#xff0c;那么配置Flash大小的选择由什…

STM32完全学习——外部中断

一、嵌套向量中断控制器 我们在这里使用标准库的方式来处理。因此只需要调用几个函数就可以了。 NVIC_InitTypeDef NVIC_InitStruct; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //中断优先级分组 分1组NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); …