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

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

参考链接:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值