Auf beiden Plattformen haben Sie
für short
(16bit):htons()
und ntohs()
für long
(32bit):htonl()
und ntohl()
Die fehlende htonll()
und ntohll()
für long long
(64bit) könnte leicht aus diesen beiden erstellt werden. Sehen Sie sich zum Beispiel diese Implementierung an.
Update-0:
Für das oben verlinkte Beispiel erwähnt Simon Richter in einem Kommentar, dass es nicht unbedingt funktionieren muss. Der Grund dafür ist:Der Compiler fügt möglicherweise irgendwo in den verwendeten Unions zusätzliche Bytes ein. Um dies zu umgehen, müssen die Gewerkschaften gepackt werden. Letzteres kann zu Leistungseinbußen führen.
Hier ist also ein weiterer ausfallsicherer Ansatz zum Erstellen von *ll
Funktionen:https://stackoverflow.com/a/955980/694576
Update-0.1:
Aus dem Kommentar von bames53 tendiere ich zu dem Schluss, dass das oben verlinkte 1. Beispiel nicht mit C++, sondern nur mit C verwendet werden soll.
Update-1:
Um die Funktionalität des *ll
zu erreichen unter Linux funktioniert, könnte dieser Ansatz der 'beste' sein.
Nicht die gleichen Namen, aber die gleiche Funktionalität existiert.
BEARBEITEN:Archivierter Link -> 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 und htonl (und ähnliche Makros) sind gut, wenn Sie darauf bestehen, mit Byte-Sex umzugehen.
Es ist jedoch viel besser, das Problem zu umgehen, indem Sie Ihre Daten in ASCII oder ähnlichem ausgeben. Es benötigt etwas mehr Platz und überträgt etwas langsamer über das Netz, aber die Einfachheit und Zukunftssicherheit sind es wert.
Eine andere Möglichkeit besteht darin, Ihre ints und shorts numerisch zu zerlegen. Also Sie &0xff und teilen Sie wiederholt durch 256. Dies ergibt ein einziges Format auf allen Architekturen. Aber ASCII hat immer noch den Vorteil, weil es einfacher zu debuggen ist.