为了弄明白这个字节序的区分,我们首先需要知道为什么会有这两种字节序。
根本原因在于多字节数据的存储方式,即大小端问题。假设有一个四字节的 int 对象 :int A =
(01020304)16
(
01020304
)
16
,A 的最低字节为
0416
04
16
,最高字节为
0116
01
16
其存储的起始地址为 0X100;
有些机器采用大端(Big-Endian)方式:
另一些则采用小端(Little-Endian)方式:
为了统一,TCP/IP 各层协议将字节序定义为 Big-Endian,因此TCP/IP协议中使用的字节序通常称之为网络字节序。
由此可知网络字节序与 CPU类型、操作系统类型无关,但主机序则由 CPU 类型和其上运行的操作系统决定:
CPU | 操作系统 | 字节序 |
---|---|---|
Alpha | 全部 | Little endian |
HP-PA | NT | Little endian |
HP-PA | UNIX | Big endian |
Intelx86 | 全部 | Little endian |
- htons() 把unsigned short类型从主机序转换到网络序
- htonl() 把unsigned long类型从主机序转换到网络序
- ntohs() 把unsigned short类型从网络序转换到主机序
- ntohl() 把unsigned long类型从网络序转换到主机序
- inet_addr() 把一个点分十进制的IP转换成一个长整数型数(u_long类型),同样功能且支持 IPv6 的函数为 inet_pton()
在使用little endian的系统中 这些函数会把字节序进行转换,在使用big endian类型的系统中 这些函数会定义成空宏。
参考链接: