从字面上看,对 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;
关于小端:
地址值
100 1
101 0
102 0
103 0
在 htonl(a) 之后
地址值
100 0
101 0
102 0
103 1
=============================================在大端机器上:
地址值
100 0
101 0
102 0
103 1
在 htonl(a) 之后
地址值
100 1
101 0
102 0
103 0
这是否意味着 htonl() 将改变字节的顺序,而不管机器架构如何?
如果你正确使用它,那么它不应该在大端机器上交换字节。
htonl
在特定于体系结构的标头中定义。通常情况下machine/endian.h
将包含您的架构特定标头。如果您重新定义它,它将按照您设置的方式执行。如果您想要真实的行为,那么您应该始终使用正确的体系结构标头。在大端机器上,这是一个无操作。在小端机器上,它通常链接到特定的处理器指令。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)