如何处理网络字节序之htonl和ntohl

htonl
ntohl


其实,这两个函数的内部实现是一样的,它首先判断机器是否是大字节序,如果是,则什么都不做,否则就转换一下。(说白了,其实只需要一个函数都是一样的,这样做只不过代码看起来更好理解,即没次发送我都转换成网络序,每次接收到后都转换成主机序)


因为网络字节序约定是大字节序的,也就是说,我们发出的和收到的都应该是大字节序处理后。


只要是发送,我们就调用htonl将主机序转换成网络字节序,只要是收到的,我们就调用ntohl将其网络序转换成主机序(不管在什么平台,只要按这个规则来就不会错,主要记住这个OK)。


因为htonl和ntohl在内部进行了字节序判断的,比如你的主机序是大字节序,即已经和网络序是相同的了,当然htonl和ntohl就什么都不做了。




原来理解出错的主要原因是:以为被转换的数值参数中包含了字节序信息,比如对一个数值连续调用两次htonl函数,第二次就应该什么都不做,因为前面一次调用已经将其转换成网络序了。哈哈,这个理解真可笑,傻瓜都知道,从一个数值怎么可能判断的出是什么字节序!显然不行嘛,人都不能判断出来,电脑更不能判断出来,所以只要你的机器不是大字节序的,何时调用htonl,ntohl都会有反应。(定式思维害人啊!!!!)


思维扩展:
如果要想让前面的错误理解变得正确,那么就得将数值和其字节序信息包装起来,哈哈!






如何记住什么是大字节序?


直观的就是大的,呵呵!
0x01020304这个值在内存中就是 01 02 03 04(左对左,右对右,直观)





  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值