网络字节序与主机字节序及相关函数

为了弄明白这个字节序的区分,我们首先需要知道为什么会有这两种字节序。
根本原因在于多字节数据的存储方式,即大小端问题。假设有一个四字节的 int 对象 :int A = ( 01020304 ) 16 ,A 的最低字节为 04 16 ,最高字节为 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类型的系统中 这些函数会定义成空宏。

参考链接:

猜你喜欢

转载自blog.csdn.net/chuanglan/article/details/80651023