字节序

1. 为什么会有字节序的问题

电子数据存储在媒介上,如磁盘、内存等等,获取数据时需要从本地读取或远程网络传输,多个字节的数据就有字节存取的顺序问题,使用正确的字节序才正确解释数据。

1.1. 小端和大端

以二字节整数0x0201为例,低位字节0x01为小端,高位字节0x02为大端。存储为数据时,如果小端0x01位于起始地址,为小端字节序;如果大端0x02位于起始地址,为大端字节序。

1.2. 表一:小端字节序

地址 0 1
数据 0x01 0x02

表一存储的数据,使用小端字节序读取的结果为0x0201,使用大端字节序读取的结果为0x0102。正确的结果应为0x0201,即应使用小端字节序读取数据。

1.3. 表二:大端字节序

地址 0 1
数据 0x02 0x01

表二存储的数据,使用小端字节序读取的结果为0x0102,使用大端字节序读取的结果为0x0201。正确的结果应为0x0201,即应使用大端字节序读取数据。

2. 字节序的应用类型

2.1. 网络字节序

TCP/IP协议统一使用大端字节序,称为网络字节序。它与具体的处理器类型、操作系统无关,从而可以保证数据在不同主机之间传输时能够被正确解释。

2.2. 主机字节序

目前市面上的处理器类型主要有两大阵营,一个是intel、AMD为首的CISC复杂指令集x86系列处理器;另一个是以IBM、ARM为首的RISC精简指令集ARM系列处理器。

x86系列处理器使用小端字节序。

IBM公司的处理器为PowerPC架构,ARM公司处理器为ARM架构,小端字节序和大端字节序都支持,具体使用的字节序与操作系统相关。

3. 测试字节序类型

4. 字节序转换