1.81、什么是大端序、小端序和网络字节序
大端序(Big-endian)、小端序(Little-endian)和网络字节序是描述多字节数据在内存中存储顺序的概念,核心区别在于“高位字节”和“低位字节”存放的位置不同:
一、三种字节序的定义与特点
1. 大端序(Big-endian)
- • 存储规则:将数据的 最高有效字节(MSB,Most Significant Byte) 存放在内存的 低地址处,最低有效字节(LSB)存放在高地址处。
- • 直观理解:类似人类书写数字的顺序(左高右低)。
- • 示例:十六进制数
0x12345678
的字节存储顺序为12 34 56 78
(从低地址到高地址)。
- • 示例:十六进制数
- • 典型应用:网络协议(如TCP/IP)、部分大端CPU(如PowerPC、IBM主机)。
2. 小端序(Little-endian)
- • 存储规则:将数据的 最低有效字节(LSB) 存放在内存的 低地址处,最高有效字节(MSB)存放在高地址处。
- • 直观理解:与人类书写顺序相反(左低右高)。
- • 示例:十六进制数
0x12345678
的字节存储顺序为78 56 34 12
(从低地址到高地址)。
- • 示例:十六进制数
- • 典型应用:x86、ARM(多数实现)、Intel等主流CPU架构。
3. 网络字节序(Network Byte Order)
- • 本质:一种 统一的大端序标准,用于网络通信中数据传输。
- • 作用:确保不同字节序的设备(如大端机与小端机)在网络上传输多字节数据时,能正确解析数据,避免因字节顺序差异导致错误。
- • 应用场景:所有互联网协议(如TCP/IP、UDP、HTTP等)均使用网络字节序。
二、为什么需要字节序?
1. 硬件架构的差异性
不同CPU厂商对字节序的选择不同,例如:
- • x86(小端序) vs. PowerPC(大端序)。
- • 这种差异导致同一多字节数据(如
int
、float
)在不同机器的内存中存储顺序不同。
2. 数据交换的一致性需求
- • 跨平台通信:当两台字节序不同的机器通过网络传输数据时,必须约定统一的字节序(如网络字节序),否则会导致数据解析错误(例如将
0x1234
解析为0x3412
)。 - • 文件存储:某些文件格式(如BMP、PNG)会显式指定字节序,确保跨平台读取。
3. 协议标准化
互联网协议强制规定使用 网络字节序(大端序) 作为数据传输的标准,确保全球设备的互通性。例如:
- • 主机在发送数据前,需将本地字节序(小端或大端)转换为网络字节序;
- • 接收方收到数据后,再转换为本地字节序。
三、对比总结
名称 | 存储顺序描述 | 典型应用/架构 |
大端序 | 高位字节存低地址,低位字节存高地址 | 网络协议、部分大端CPU(如IBM主机) |
小端序 | 低位字节存低地址,高位字节存高地址 | x86、ARM(多数实现)、Intel等主流CPU |
网络字节序 | 统一采用大端序 | 所有网络通信协议(TCP/IP、HTTP等) |
四、关键要点
- • 字节序是底层机制:仅影响多字节数据(如
int
、double
、结构体),单字节数据(如char
)无字节序问题。 - • 转换函数:C/C++提供
htonl()
、htons()
、ntohl()
、ntohs()
等函数,用于本地字节序与网络字节序的转换(h
=Host,n
=Network,l
=Long,s
=Short)。 - • 跨平台开发注意事项:涉及二进制数据存储或网络传输时,必须显式处理字节序,避免因架构差异导致的BUG。
本文首发于【讳疾忌医-note】公众号,未经授权,不得转载。
(加入我的知识星球,免费获取账号,解锁所有文章。)
阅读剩余
版权声明:
作者:讳疾忌医-note
链接:https://www.1217zy.vip/archives/1779
文章版权归作者所有,未经允许请勿转载。
THE END