htonl()与__builtin_bswap32()的区别

8

__builtin_bswap32()函数用于字节反转(它用于解决小/大端问题 (来自gcc))。

htonl()函数也用于字节反转(从主机到网络的转换)。

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

有人能够确认这两个函数做相同的事情吗?(欢迎标准参考)


2
也许您应该重新考虑所接受的答案? - Greg Schmit
3个回答

35

我不同意您的说法,即 htonl() 用于反转字节顺序。它是用于将主机字节序转换为网络字节序。根据主机的字节序,这可能会或可能不会导致字节顺序被颠倒。

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

  • 如果您希望从主机字节序转换为网络字节序,请使用 htonl()
  • 如果您想要反转字节顺序,请使用 __builtin_bswap32()

1
如果架构是小端的话,它们就是相同的。 - MOHAMED
4
没问题。但是在大端机上,编译器会将htonl()简化为return input - David Heffernan

11

只需查看源代码:(来自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


不需要阅读源代码就可以找到这个问题的答案,记住如果你只依赖于源代码,可能会错过重要的细节。 - David Heffernan

6

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

htonl/ntohl仅在小端机器上颠倒字节顺序。

例如,在PowerPC(大端)上,ntohl/htonl只返回输入值,没有更多操作,而bswap32无论如何都会颠倒字节顺序。


如果架构是小端,那么它们就是相同的。 - MOHAMED

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接