__builtin_bswap32()
函数用于字节反转(它用于解决小/大端问题 (来自gcc))。
htonl()
函数也用于字节反转(从主机到网络的转换)。
我检查了两个函数,它们返回相同的结果。
有人能够确认这两个函数做相同的事情吗?(欢迎标准参考)
__builtin_bswap32()
函数用于字节反转(它用于解决小/大端问题 (来自gcc))。
htonl()
函数也用于字节反转(从主机到网络的转换)。
我检查了两个函数,它们返回相同的结果。
有人能够确认这两个函数做相同的事情吗?(欢迎标准参考)
我不同意您的说法,即 htonl()
用于反转字节顺序。它是用于将主机字节序转换为网络字节序。根据主机的字节序,这可能会或可能不会导致字节顺序被颠倒。
我建议您使用表达正确语义意图的函数:
htonl()
。__builtin_bswap32()
。htonl()
简化为return input
。 - David Heffernan只需查看源代码:(来自glib 2.18的示例)
#undef htonl
#undef ntohl
uint32_t
htonl (x)
uint32_t x;
{
#if BYTE_ORDER == BIG_ENDIAN
return x;
#elif BYTE_ORDER == LITTLE_ENDIAN
return __bswap_32 (x);
#else
# error "What kind of system is this?"
#endif
}
weak_alias (htonl, ntohl)
同时 : #define __bswap_32(x) ((unsigned int)__builtin_bswap32(x))
源代码参见 : http://fossies.org/dox/glibc-2.18/htonl_8c_source.html
可以看到,htonl
仅在小端机器上调用__builtin_bswap32
。
bswap_32总是颠倒字节顺序,在任何架构上。
htonl/ntohl仅在小端机器上颠倒字节顺序。
例如,在PowerPC(大端)上,ntohl/htonl只返回输入值,没有更多操作,而bswap32无论如何都会颠倒字节顺序。