从字面上看对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()会更改字节的顺序,而不考虑计算机的体系结构?

最佳答案

如果正确使用它,则不应在大型字节序计算机上交换字节。
htonl在特定于体系结构的 header 中定义。通常,machine/endian.h将包含特定于体系结构的 header 。如果重新定义它,它将执行您设置的目标。如果您想要真实的行为,那么应该始终使用正确的体系结构头。在大型字节序机器上,这是没有操作的。在小型字节序计算机上,它通常链接到特定的处理器指令。

10-06 12:04