QT 关于UDP报文大小端存储

QT 关于UDP报文大小端存储

Qt中有一个类专门负责大端小端字节序的转换。

所谓大端小端字节序,就是在程序中,传输信息一般都是以字节为单位来进行计算的。那么我们如果要传输字(两个字节),三字节,四字节以及更多的一串数据的时候,到底以什么样的顺序来传递呢?

譬如,传输一个字节:1111 1100 ,我们可以直接用char,qint_8变量去传递,因为计算机是可以直接解析字节的,这就是个单位,就跟我们说的厘米,毫米,千克,秒一样,字节就是单位。

那么1111 1100 1110 1110,又怎么传输呢?

前面的字节先传,还是后面的字节先传?

所以,后来就有了大端小端的区别。以上述为例,前面字节先传,后面字节后传,就叫大端。

也叫高高低低,正向序列,就跟平时我们看12, 称为十二,十在前,即为高,二在后,即为低。

那么如果程序中需要高低高低呢?意思就是有一个双字(四个字节)的数字,可能是一个很大的数。总之就是4个字节。本来1234,现在传输的时候变成了,1,3,2,4,到了对端之后,对方自然会将收到的4个字节重新解析为1234的。

X86的电脑是小端序列传输。
—————————————————————————————————————————————

#include

加上上述QtEndian头文件,即可使用字节序转换类中的函数成员。

如果用的是cmake,那么需要使用find_package,在CMakeList.txt里面加上

find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)

qint16_be  ---》bigger endian,大端序的字,也可以叫做16位的整数。   

qint16_le  ---》little endian,小端序的字,下面的以此类推即可。

qint32_be

qint32_le

qint64_be

qint64_le

quint16_be

quint16_le

quint32_be

quint32_le

quint64_be

quint64_le

我们可以用上面的Qt标准类型来定义该类型变量,也就可以无需用字节数组来代替了,很方便。

T qFromBigEndian(const void *src) ,src是指针变量,意思就是这个src可以代表很多个字节的数,或者字符串,字节数组等等。
T qFromBigEndian(T src) 将src这个多字节的数,从大端序转换为当前主机的字节序,譬如我的电脑是X86,那么转为小端序。

T可以是quint16, qint16, quint32, qint32, quint64, or qint64

下面的函数,以此类推。
void qFromBigEndian(const void *src, qsizetype count, void *dest)
T qFromLittleEndian(const void *src)
T qFromLittleEndian(T src)
void qFromLittleEndian(const void *src, qsizetype count, void *dest)
void qToBigEndian(T src, void *dest)
T qToBigEndian(T src)
void qToBigEndian(const void *src, qsizetype count, void *dest)
void qToLittleEndian(T src, void *dest)
T qToLittleEndian(T src)
void qToLittleEndian(const void *src, qsizetype count, void *dest)
上面的src和dest指针,如果是相等的指针变量,那么意思就是将src反转

如果src和dest不等,那么两者不能指向重叠的内存区域,譬如同时指向一个数组的不同部分,但其中有重叠,是不可以的。
—————————————————————————————————————————————

大小端API头文件: #include
常见API如下,详见头文件的描述
qToBigEndian(T source)
qFromBigEndian(T source)
qToLittleEndian(T source)
qFromLittleEndian(T source)
qToBigEndian(T src, void dest)
qToLittleEndian(T src, void dest)

—————————————————————————————————————————————
示例
接收到的Udp 报文为 4d 48 88 50 且通讯协议中的数据均为小端存储,低位在前
解析应该为 50 88 48 4d则需要使用**qFromLittleEndian(T source)**进行转换

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值