htonl()vs __builtin_bswap32()

MOH*_*MED 4 c linux gcc endianness

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

htonl() 用于反转字节(从主机到网络的转换).

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

是否有人可以确认两种功能都做同样的事情?(赞赏标准参赛者)

Dav*_*nan 20

我不同意你htonl()用于反转字节顺序的语句.它用于从主机转换为网络字节顺序.根据主机的字节顺序,可能会或可能不会导致字节顺序被反转.

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

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

  • @MOHAMED正确.但是在大端机器上,编译器会将`hotonl()`变成一个简单的`return input`. (4认同)

luc*_*asg 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)
Run Code Online (Sandbox Code Playgroud)

而且: #define __bswap_32(x) ((unsigned int)__builtin_bswap32(x))

来源:http://fossies.org/dox/glibc-2.18/htonl_8c_source.html

如您所见,htonl只能调用__builtin_bswap32little-endian机器.


ole*_*rch 5

bswap_32总是在任何架构上反转字节顺序.

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

例如,在PowerPC(大端)上,ntohl/htonl只返回输入值,而bswap32无论如何都会反转字节顺序.