Su entrambe le piattaforme hai
per short
(16bit):htons()
e ntohs()
per long
(32bit):htonl()
e ntohl()
Il htonll()
mancante e ntohll()
per long long
(64 bit) potrebbe essere facilmente costruito da quei due. Guarda questa implementazione per esempio.
Aggiornamento-0:
Per l'esempio collegato sopra, Simon Richter menziona in un commento che non deve necessariamente funzionare. La ragione di ciò è:il compilatore potrebbe introdurre byte extra da qualche parte nelle unioni utilizzate. Per ovviare a questo i sindacati devono essere imballati. Quest'ultimo potrebbe portare a una perdita di prestazioni.
Quindi ecco un altro approccio sicuro per costruire il *ll
funzioni:https://stackoverflow.com/a/955980/694576
Aggiornamento-0.1:
Dal commento di bames53 tendo a concludere che il primo esempio collegato sopra non deve essere usato con C++, ma solo con C.
Aggiornamento 1:
Per ottenere la funzionalità del *ll
functions su Linux questo approccio potrebbe essere il "migliore".
Non gli stessi nomi, ma esiste la stessa funzionalità.
EDIT:collegamento archiviato -> 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 e htonl (e macro simili) vanno bene se insisti a gestire il byte sex.
Tuttavia, è molto meglio eludere il problema emettendo i dati in ASCII o simili. Ci vuole un po' più di spazio e la trasmissione sulla rete è un po' più lenta, ma ne vale la pena per la semplicità e l'impermeabilità al futuro.
Un'altra opzione è quella di smontare numericamente i tuoi int e short. Quindi tu &0xff e dividi ripetutamente per 256. Ciò fornisce un unico formato su tutte le architetture. Ma ASCII ha ancora il vantaggio perché è più facile eseguire il debug con.