__builtin_bswap32() se usa para invertir bytes (se usa para problemas de littel/big endian (de gcc)).
htonl() también se usa para invertir bytes (conversión de host a red).
Revisé ambas funciones y devuelven el mismo resultado.
¿Hay alguien que pueda confirmar que ambas funciones hacen lo mismo? (se agradecen las referencias estándar)
No estoy de acuerdo con su afirmación de que htonl() se usa para invertir el orden de los bytes. Se utiliza para convertir de host a orden de bytes de red. Dependiendo del orden de bytes del host, eso puede o no dar como resultado que se invierta el orden de los bytes.
Le sugiero que use la función que expresa la intención semántica correcta:
htonl() .__builtin_bswap32() .Solo mire el código fuente: (ejemplo de 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) Y: #define __bswap_32(x) ((unsigned int)__builtin_bswap32(x))
Fuente aquí: http://fossies.org/dox/glibc-2.18/htonl_8c_source.html
Como puede ver, htonl solo llama a __builtin_bswap32 en máquinas little-endian.
bswap_32 siempre invierte el orden de los bytes, en cualquier arquitectura.
htonl/ntohl invierte el orden de bytes solo en máquinas little endian.
Por ejemplo, en PowerPC (big endian), ntohl/htonl solo devuelve el valor de entrada, no más, mientras que bswap32 de todos modos invertirá el orden de los bytes.