“大小端”(Endianness)指的是多字节数据在内存中存储或在网络上传输时的字节顺序(Byte Order)
简单来说,当一个数据很大,需要拆成多个字节(Byte)来表示时,是先放高位字节(大端),还是先放低位字节(小端)。
为什么会有“大小端”?
在计算机里,最小的存储单元是字节(1 Byte = 8 bits)。
- 如果你要传输一个字节的数据(比如十进制的
18,十六进制为0x12),那不需要考虑顺序。 - 但 Modbus 的保持寄存器(4xxxx)每个寄存器是 16 位(2 个字节)。如果你要传输一个 16 位的数据,或者一个 32 位的浮点数(占 2 个寄存器),就必须决定哪个字节在前,哪个字节在后。
大端与小端的区别
假设我们要传输一个 16 位的十六进制数:0x1234。 这个数据由两个字节组成:高位字节(MSB)是 12,低位字节(LSB)是 34。
1. 大端模式 (Big-Endian)
- 概念:符合人类的阅读习惯。高位字节存放在低地址(先发送),低位字节存放在高地址(后发送)。
- 传输顺序:先发
12,再发34。 - 特点:Modbus 标准协议默认就是大端模式。
2. 小端模式 (Little-Endian)
- 概念:很多主流的 CPU(如 Intel、ARM、STM32 等)在内部内存中倾向于使用小端。低位字节存放在低地址(先发送),高位字节存放在高地址(后发送)。
- 传输顺序:先发
34,再发12。
32 位数据(如浮点数)的“混合端”
在 Modbus 中读取 32 位数据(如 float 或 int32)时,情况会更复杂一点,因为涉及 2 个寄存器(4 个字节)。假设数据是 0x12345678,常见的排列组合有 4 种:
- Big-Endian (ABCD):
12 34 56 78(标准大端) - Little-Endian (DCBA):
78 56 34 12(标准小端) - Little-Endian Byte Swap (CDAB):
56 78 12 34(字节交换,也叫后大端) - Big-Endian Byte Swap (BADC):
34 12 78 56(字节交换,也叫前小端)
对于两字节(16 位)数据,因为只有两个字节,它的排列组合只有两种可能:要么是
AB(大端),要么是BA(小端)。 而到了四字节(32 位)数据,因为它跨了两个 Modbus 寄存器,情况就变得复杂了。这里其实包含了两个层面的“颠倒”: