一个int型整数,一般情况下占4个字节。那么这4个字节在内存中是怎么排列的呢?低内存地址存放的是低位字节还是高位子节呢?这就涉及到大端规则和小端规则。
这是一个特别小特别基础的知识点,在大部分的日常开发中,我们并不需要理会大小端规则。但是当涉及到跨平台网络数据传输的时候,就需要考虑大小端规则了。
大端规则(Big-Endian)
将高位字节存储在低位地址,低位字节存储在高位地址,这种存储方式成为大端规则,也称为大端序。
以0xA1A2A3A4
为例,使用大端规则,内存排列如下:
低地址 ——> | ——> | ——> | ——> 高低地址 |
---|---|---|---|
0xA1 | 0xA2 | 0xA3 | 0xA4 |
小端规则(Little-Endian)
将低位字节存储在低位地址,高位字节存储在高位地址,这种存储方式成为小端规则,也称为小端序。
以0xA1A2A3A4
为例,使用小端规则,内存排列如下:
低地址 ——> | ——> | ——> | ——> 高低地址 |
---|---|---|---|
0xA4 | 0xA3 | 0xA2 | 0xA1 |
网络字节序
不同平台使用不同的字节序。为了保证网络传输的数据能够被所有平台正确读取,TCP网络传输统一采用大端规则。
如果你使用C/C++/Objective-C语言,有几个方法可以方便将本地字节序和网络字节序互相转换。
1 | // 网络字节序 -> 本地字节序 |