现在的位置: 首页 > 综合 > 正文

htons(), htonl(), ntohs(), ntohl()

2018年05月27日 ⁄ 综合 ⁄ 共 1326字 ⁄ 字号 评论关闭

将多字节整数类型的数据,从主机的字节顺序转化为网络字节顺序
原型
#include <netinet/in.h>

uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);

 

描述
不同的计算机里对它们的多字节整数(例如:一个大于char的整数)使用不同的字节顺序。这就意味着,如果你从intel的盒子中send()一个两个字节的短整数到一个Mac中(在它们成为Intel之前),一个计算机认为是数字1,而另外一个计算机会认为它是数字256,反之亦然。

解决这个问题的办法是:所有的人撇开它们的不同之处,同意摩托罗拉和IBM的顺序是正确的,而Intel使用的是怪异的方式,所以我们在将他们发送出去之前把所有的字节以“正序”方式排列。既然Intel是一个“反序”的机器,所以调用我们需要的,以“网络字节顺序”排列的字节是很正确的。所以这些函数把你的本机字节顺序转化为网络字节顺序然后再转化回来。

(这就意味着,在Intel上面,这些函数把所有的字节调换过来,而在PowerPC上面,它们什么都没有做,因为在那上面字节本身是以网络字节顺序排列的。但是你依然要在你的程序当中使用它们,因为别的人有可能将它们应用到Intel机器当中,使之依然正常的运行。)

注意到这些类型包含32-位(4个字节,可能是整数)和16-位(两个字节和short很像)数据。64-位的机器可以使用htonll()作为64-位整数,但是我们没有见到它。你必须自己写。

不管怎样,使用这些函数决定于你要从主机字节顺序(你的电脑上的)还是网络字节顺序转化。如果是"host",函数的第一个字母为"h",否则"network"就为"n"。函数的中间字母总是"to",因为你要从一个转化到另一个,倒数第二个字母说明你要转化成什么。最后一个字母是数据的大小,"s"表示short,"l"表示long。于是:

                       htons()    host to network short
 
                       htonl()     host to network long
 
                       ntohs()    network to host short
 
                       ntohl()    network to host long
 
返回值
每个函数返回转化后的值

 

例子
uint32_t some_long = 10;
uint16_t some_short = 20;

 

uint32_t network_byte_order;

 

// convert and send
network_byte_order = htonl(some_long);
send(s, &network_byte_order, sizeof(uint32_t), 0);

 

some_short == ntohs(htons(some_short)); // this expression is true

抱歉!评论已关闭.