0%

大端规则和小端规则

一个int型整数,一般情况下占4个字节。那么这4个字节在内存中是怎么排列的呢?低内存地址存放的是低位字节还是高位子节呢?这就涉及到大端规则和小端规则。

这是一个特别小特别基础的知识点,在大部分的日常开发中,我们并不需要理会大小端规则。但是当涉及到跨平台网络数据传输的时候,就需要考虑大小端规则了。

大端规则(Big-Endian)

将高位字节存储在低位地址,低位字节存储在高位地址,这种存储方式成为大端规则,也称为大端序。

0xA1A2A3A4为例,使用大端规则,内存排列如下:

低地址 ——> ——> ——> ——> 高低地址
0xA1 0xA2 0xA3 0xA4

小端规则(Little-Endian)

将低位字节存储在低位地址,高位字节存储在高位地址,这种存储方式成为小端规则,也称为小端序。

0xA1A2A3A4为例,使用小端规则,内存排列如下:

低地址 ——> ——> ——> ——> 高低地址
0xA4 0xA3 0xA2 0xA1

网络字节序

不同平台使用不同的字节序。为了保证网络传输的数据能够被所有平台正确读取,TCP网络传输统一采用大端规则。

如果你使用C/C++/Objective-C语言,有几个方法可以方便将本地字节序和网络字节序互相转换。

1
2
3
4
5
6
7
8
9
// 网络字节序 -> 本地字节序
ntohs(x) // 转换short类型
ntohl(x) // 转换long类型
ntohll(x) // 转换long long类型

// 本地字节序 -> 网络字节序
htons(x) // 转换short类型
htonl(x) // 转换long类型
htonll(x) // 转换long long类型