字面意思混淆了htonl()。在如此多的链接中,我发现执行htonl的代码是:
#define HTONL(n) (((((unsigned long)(n) & 0xFF)) << 24) | \
((((unsigned long)(n) & 0xFF00)) << 8) | \
((((unsigned long)(n) & 0xFF0000)) >> 8) | \
((((unsigned long)(n) & 0xFF000000)) >> 24))
如果在两台机器上运行相同的代码,它将交换字节顺序。 示例:uint32_t a = 0x1;
在Little Endian上:
100 1
101 0
102 0
103 0
在htonl(a)之后
100 0
101 0
102 0
103 1
============================================ 在Big Endian机器上:
100 0
101 0
102 0
103 1
在htonl(a)之后
100 1
101 0
102 0
103 0
这是否意味着无论机器架构如何,htonl()都会改变字节的顺序?
答案 0 :(得分:8)
如果你正确使用它,那么它不应该在大端机器上交换字节。
htonl
在特定于体系结构的标头中定义。通常machine/endian.h
将包含您的体系结构特定标头。如果您重新定义它,那么它将执行您设置的操作。如果您想要真实的行为,那么您应该始终使用正确的架构标头。在大端机器上它是一个没有操作。在小端机器上,它通常与特定的处理器指令相关联。
答案 1 :(得分:5)
我认为理解这个功能的关键是理解它的名字。
函数htonl是:
H ost
N etwork L ong
即:它从主机订单转换为网络定义(Big Endian)订单。
不同的主机可以有不同的表示形式:
无论采用何种机器格式,此功能都会转换为通用网络格式,因此可以轻松,可靠地将数据发送到网络上可能具有不同表示形式的其他计算机。
一旦您理解了主机 / 网络的概念,就不难理解网络订单是Big-Endian,以及任何大型主机-Endian根本不需要任何转换。