是否htonl()改变了BIG ENDIAN机器上的字节顺序?

时间:2014-01-23 14:47:10

标签: c byte-order-mark endianness

字面意思混淆了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()都会改变字节的顺序?

2 个答案:

答案 0 :(得分:8)

如果你正确使用它,那么它不应该在大端机器上交换字节。

htonl在特定于体系结构的标头中定义。通常machine/endian.h将包含您的体系结构特定标头。如果您重新定义它,那么它将执行您设置的操作。如果您想要真实的行为,那么您应该始终使用正确的架构标头。在大端机器上它是一个没有操作。在小端机器上,它通常与特定的处理器指令相关联。

答案 1 :(得分:5)

我认为理解这个功能的关键是理解它的名字。 函数htonl是:
H ost N etwork L ong

即:它从主机订单转换为网络定义(Big Endian)订单。

不同的主机可以有不同的表示形式:

  • 大-结束
  • 小端
  • 甚至其他一些表示(想象一下在base-3上工作的新机器,或者有中间向外表示?

无论采用何种机器格式,此功能都会转换为通用网络格式,因此可以轻松,可靠地将数据发送到网络上可能具有不同表示形式的其他计算机。

一旦您理解了主机 / 网络的概念,就不难理解网络订单是Big-Endian,以及任何大型主机-Endian根本不需要任何转换。

相关问题