En ambas plataformas tienes
para short
(16 bits):htons()
y ntohs()
para long
(32 bits):htonl()
y ntohl()
El htonll()
perdido y ntohll()
para long long
(64 bits) podría construirse fácilmente a partir de esos dos. Vea esta implementación por ejemplo.
Actualización-0:
Para el ejemplo vinculado anteriormente, Simon Richter menciona en un comentario que no necesariamente tiene que funcionar. La razón de esto es:el compilador podría introducir bytes adicionales en algún lugar de las uniones utilizadas. Para evitar esto, es necesario empaquetar los sindicatos. Esto último podría conducir a una pérdida de rendimiento.
Así que aquí hay otro enfoque a prueba de fallas para construir el *ll
funciones:https://stackoverflow.com/a/955980/694576
Actualización-0.1:
Del comentario de bames53, tiendo a concluir que el primer ejemplo vinculado anteriormente no se debe usar con C++, sino solo con C.
Actualización-1:
Para lograr la funcionalidad del *ll
funciones en Linux, este enfoque podría ser el 'mejor'.
No son los mismos nombres, pero existe la misma funcionalidad.
EDITAR:Enlace archivado -> https://web.archive.org/web/20151207075029/http://msdn.microsoft.com/en-us/library/a3140177(v=vs.80).aspx
_byteswap_uint64, _byteswap_ulong, _byteswap_ushort
htons y htonl (y macros similares) son buenas si insiste en lidiar con byte sex.
Sin embargo, es mucho mejor eludir el problema enviando sus datos en ASCII o similar. Se necesita un poco más de espacio y se transmite a través de la red un poco más lentamente, pero la simplicidad y la preparación para el futuro valen la pena.
Otra opción es separar numéricamente sus int y short. Entonces usted &0xff y divide por 256 repetidamente. Esto da un formato único en todas las arquitecturas. Pero ASCII todavía tiene la ventaja porque es más fácil de depurar.