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(大端序)。
  • • 这种差异导致同一多字节数据(如intfloat)在不同机器的内存中存储顺序不同。

2. 数据交换的一致性需求

  • • 跨平台通信:当两台字节序不同的机器通过网络传输数据时,必须约定统一的字节序(如网络字节序),否则会导致数据解析错误(例如将 0x1234 解析为 0x3412)。
  • • 文件存储:某些文件格式(如BMP、PNG)会显式指定字节序,确保跨平台读取。

3. 协议标准化

互联网协议强制规定使用 网络字节序(大端序) 作为数据传输的标准,确保全球设备的互通性。例如:

  • • 主机在发送数据前,需将本地字节序(小端或大端)转换为网络字节序;
  • • 接收方收到数据后,再转换为本地字节序。

三、对比总结

名称 存储顺序描述 典型应用/架构
大端序 高位字节存低地址,低位字节存高地址 网络协议、部分大端CPU(如IBM主机)
小端序 低位字节存低地址,高位字节存高地址 x86、ARM(多数实现)、Intel等主流CPU
网络字节序 统一采用大端序 所有网络通信协议(TCP/IP、HTTP等)

四、关键要点

  • • 字节序是底层机制:仅影响多字节数据(如intdouble、结构体),单字节数据(如char)无字节序问题。
  • • 转换函数:C/C++提供 htonl()htons()ntohl()ntohs() 等函数,用于本地字节序与网络字节序的转换(h=Host,n=Network,l=Long,s=Short)。
  • • 跨平台开发注意事项:涉及二进制数据存储或网络传输时,必须显式处理字节序,避免因架构差异导致的BUG。

本文首发于【讳疾忌医-note】公众号,未经授权,不得转载。
(加入我的知识星球,免费获取账号,解锁所有文章。)

阅读剩余
THE END