是否htonl()改变了BIG ENDIAN机器上的字节顺序?
字面意思是关于htonl()的混淆。 在这么多链接中,我发现执行htonl的代码是:
#define HTONL(n) (((((unsigned long)(n) & 0xFF)) << 24) | \ ((((unsigned long)(n) & 0xFF00)) <> 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()都会改变字节的顺序?
如果你正确使用它,那么它不应该在大端机器上交换字节。
htonl
在特定于体系结构的标头中定义。 通常, machine/endian.h
将包含您的体系结构特定标头。 如果您重新定义它,那么它将执行您设置的操作。 如果您想要真实的行为,那么您应该始终使用正确的架构标头。 在大端机器上它是一个没有操作。 在小端机器上,它通常与特定的处理器指令相关联。
我认为理解这个function的关键是理解它的名字。 函数htonl是:
H to N etwork L ong
即:它从主机订单转换为网络定义(Big Endian)订单。
不同的主机可以有不同的表示forms:
- 大结局
- 小端
- 甚至一些其他的表示(想象一些在base-3上工作的新机器,或者具有中 – 外表示?
无论何种机器格式,此function都会转换为通用网络格式,因此可以轻松,可靠地将数据发送到网络上可能具有不同表示forms的其他计算机。
一旦理解了主机 / 网络的概念,就不难理解网络订单是Big-Endian,任何Big-Endian的主机根本不需要任何转换。