htonl()vs __builtin_bswap32()

__builtin_bswap32()用于反转字节(它用于littel / big endian问题(来自gcc))。

htonl()也用于反转字节(从主机到networking的转换)。

我检查了两个函数,他们返回相同的结果。

有没有人可以确认这两个function是一样的? (标准的refences是赞赏)

只要看源代码:(例如从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只能在little-endian机器上调用__builtin_bswap32

我不同意你的声明htonl()是用来颠倒字节顺序的。 它用于从主机转换为网络字节顺序。 根据主机的字节顺序,可能会或可能不会导致字节顺序颠倒。

我建议你使用表达正确语义意图的函数:

  • 如果你想从主机转换为网络字节顺序,使用htonl()
  • 如果你想颠倒字节顺序,使用__builtin_bswap32()

在任何体系结构上,bswap_32总是颠倒字节顺序。

htonl / ntohl仅在小端机器上反转字节序。

例如,在PowerPC(big endian)上,ntohl / htonl只是返回输入值,而bswap32无论如何都会颠倒字节顺序。