大端规则和小端规则

来源:互联网 发布:提前上班被开除 知乎 编辑:程序博客网 时间:2024/06/03 01:09

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

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

大端规则(Big-Endian)

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

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

低地址 ——>——>——>——> 高低地址0xA10xA20xA30xA4

小端规则(Little-Endian)

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

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

低地址 ——>——>——>——> 高低地址0xA40xA30xA20xA1

网络子节序

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

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

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

Posted by 范杰(Jeffery Fan) · August 7th, 2016 
原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0

0 0
原创粉丝点击