htons、htonl、ntohl、ntohs的区别与使用

1、网络编程字节转换

  • s表示短、l表示长;
    ntohs =net to host short int 16位
    htons=host to net short int 16位
    ntohl =net to host long int 32位
    htonl=host to net long int 32位
  • 上面四个函数分别用于从网络字节顺序(net)与主机字节顺序(host)之间的转换
  • 上面函数用于十六进制之间的转换

2. 主机字节顺序<–>网络字节顺序

  1. htonl()表示将32位的主机字节顺序转化为32位的网络字节顺序 ; (ip地址是32位的,即htonl函数用于ip地址);
    ntohl()函数与其相反;

如:a=0x0100; 因为主机是从高字节到低字节的,所以应该转化后a=ntohs(0001); 这样 a=0001;

  1. htons()表示将16位的主机字节顺序转化为16位的网络字节顺序(i端口号是16位的 , htons函数用于端口号);
    ntohs()函数与其相反;
int main()
{
    printf("%d /n",htons(16));  //输出4096
    return 0;
}

解释如下,数字16的16进制表示为0x0010,数字4096的16进制表示为0x1000。由于Intel机器是小尾端,存储数字16时实际顺序为1000,存储4096时实际顺序为0010。因此在发送网络包时为了报文中数据为0010,需要经过htons进行字节转换。如果用IBM等大尾端机器,则没有这种字节顺序转换,但为了程序的可移植性,也最好用这个函数。

不同的CPU有不同的字节序类型 这些字节序是指整数在内存中保存的顺序 这个叫做==主机序 ==;

3.大小端模式

  • x86系列CPU都是little-endian的字节序.

网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian排序方式

详细情况请参考该链接

猜你喜欢

转载自blog.csdn.net/qq_42698422/article/details/106862785