一、字节序核心类型
1. 小端序(Little-Endian)
定义:最低有效字节(LSB) 存储在最低内存地址
存储顺序:
低地址 → 高地址:Byte0 (LSB) → Byte1 → Byte2 → Byte3 (MSB)
示例(32位数据 0x12345678):
text
地址递增方向:0x78 → 0x56 → 0x34 → 0x12
内存布局:78 56 34 12
别名:DCBA(若按寄存器顺序:D=低字, C=高字)
应用:x86/x64 CPU、Windows/Linux桌面系统、USB协议、ARM(默认小端模式)
2. 大端序(Big-Endian)
定义:最高有效字节(MSB) 存储在最低内存地址
存储顺序:
低地址 → 高地址:Byte0 (MSB) → Byte1 → Byte2 → Byte3 (LSB)
示例(32位数据 0x12345678):
text
地址递增方向:0x12 → 0x34 → 0x56 → 0x78
内存布局:12 34 56 78
别名:ABCD(A=高字, B=低字)
应用:网络协议(TCP/IP)、Java虚拟机、PowerPC、Motorola处理器、Modbus(默认大端)
二、混合字节序(字交换序)
用于解决 16位寄存器组合为32位数据 时的特殊对齐问题
1. 小端字交换(Little-Endian Word-Swap)
定义:字内小端 + 字间大端
(先按16位字分组,组内小端,组间大端)
存储顺序:
低地址 → 高地址:Word1 (低字) → Word0 (高字)
其中每个Word内部为小端序
示例(0x12345678):
text
步骤1:拆分为两个16位字 [0x1234] 和 [0x5678]
步骤2:字内小端存储 → 0x34 12 (高字) 和 0x78 56 (低字)
步骤3:字间大端排列 → 先存高字,再存低字
最终内存布局:34 12 78 56
别名:BADC(B=高字低字节, A=高字高字节, D=低字低字节, C=低字高字节)
应用:TI DSP、某些ARM嵌入式设备
2. 大端字交换(Big-Endian Word-Swap)
定义:字内大端 + 字间小端
(先按16位字分组,组内大端,组间小端)
存储顺序:
低地址 →高地址:Word0 (低字) → Word1 (高字)
其中每个Word内部为大端序
示例(0x12345678):
text
步骤1:拆分为两个16位字 [0x1234] 和 [0x5678]
步骤2:字内大端存储 → 0x12 34 (低字) 和 0x56 78 (高字)
步骤3:字间小端排列 → 先存低字,再存高字
最终内存布局:12 34 56 78 → 看似与大端相同,但实际逻辑不同!
别名:CDAB(C=低字高字节, D=低字低字节, A=高字高字节, B=高字低字节)
应用:某些PLC系统(如三菱FX系列)、CAN总线数据帧
三、完整字节序类型对照表(32位数据)
类型 别名 存储顺序(低地址→高地址) 寄存器排列 典型应用场景
Big-Endian ABCD 0x12 0x34 0x56 0x78 寄存器1:0x1234 (高字) 网络设备、Modbus
寄存器2:0x5678 (低字)
Little-Endian DCBA 0x78 0x56 0x34 0x12 寄存器1:0x5678 (低字) x86 CPU、Windows
寄存器2:0x1234 (高字)
Big-Endian Word-Swap CDAB 0x34 0x12 0x78 0x56 寄存器1:0x3412 (高字) 三菱PLC、CAN协议
寄存器2:0x7856 (低字)
Little-Endian Word-Swap BADC 0x56 0x78 0x12 0x34 寄存器1:0x7856 (低字) TI DSP、嵌入式系统
寄存器2:0x3412 (高字)
Mid-Big-Endian DCAB 0x78 0x56 0x12 0x34 寄存器1:0x5678 (低字) 极少见(历史遗留系统)
Mid-Little-Endian BADC 0x34 0x12 0x56 0x78 寄存器1:0x1234 (高字) 罕见
寄存器排列说明(以两个16位寄存器存储32位数据为例):
寄存器1:物理地址较低的寄存器
寄存器2:物理地址较高的寄存器
四、特殊类型详解
1. Mid-Big-Endian (DCAB)
存储顺序:Byte3 → Byte2 → Byte1 → Byte0
(即先存最低两字节的小端,再存最高两字节的小端)
示例:0x12345678 → 78 56 12 34
应用:PDP-11等老式系统(已淘汰)
2. Mid-Little-Endian (BADC)
存储顺序:Byte1 → Byte0 → Byte3 → Byte2
(即先存中间两字节,再存两端字节)
示例:0x12345678 → 34 12 78 56
应用:极少见(某些自定义协议)
文章声明:以上内容(如有图片或视频亦包括在内)除非注明,否则均为Net3C原创文章,转载或复制请以超链接形式并注明出处。定制服务:需要定制服务请加V:Net3c_2022
还没有评论,来说两句吧...