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

htonl
ntohl


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


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


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


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




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


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






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


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





你可能感兴趣的:(网络)