Na obou platformách máte
pro short
(16bit):htons()
a ntohs()
pro long
(32bit):htonl()
a ntohl()
Chybějící htonll()
a ntohll()
pro long long
(64bit) lze snadno sestavit z těchto dvou. Viz například tato implementace.
Aktualizace-0:
U výše uvedeného příkladu Simon Richter v komentáři zmiňuje, že to nemusí nutně fungovat. Důvodem je:Kompilátor může někde v použitých svazcích zavést další bajty. Aby se to vyřešilo, musí být odbory sbaleny. To může vést ke ztrátě výkonu.
Takže zde je další bezpečný přístup k sestavení *ll
funkce:https://stackoverflow.com/a/955980/694576
Aktualizace-0.1:
Z komentáře bames53 se přikláním k závěru, že první výše uvedený příklad by neměl být použit s C++, ale pouze s C.
Aktualizace-1:
Pro dosažení funkčnosti *ll
funguje na Linuxu, tento přístup může být 'nejlepší'.
Nejedná se o stejná jména, ale existují stejné funkce.
EDIT:Archivovaný odkaz -> 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 a htonl (a podobná makra) jsou dobré, pokud trváte na tom, že se budete zabývat bajtovým sexem.
Mnohem lepší je však tento problém obejít tím, že svá data vypíšete v ASCII nebo podobném. Zabere to trochu více místa a po síti se to přenáší trochu pomaleji, ale ta jednoduchost a zabezpečení do budoucna za to stojí.
Další možností je číselně rozebrat vaše int a short. Takže vy &0xff a dělení 256 opakovaně. To poskytuje jednotný formát na všech architekturách. Ale ASCII má stále výhodu, protože se s ním snadněji ladí.