是否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的主机根本不需要任何转换。