从字面上看对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 。如果重新定义它,它将执行您设置的目标。如果您想要真实的行为,那么应该始终使用正确的体系结构头。在大型字节序机器上,这是没有操作的。在小型字节序计算机上,它通常链接到特定的处理器指令。