Skip to content

Big-Endian- und Little-Endian-Unterstützung für die Byte-Bestellung

Lösung:

Auf beiden Plattformen hast du

zum short (16bit): htons() und ntohs()

zum long (32bit): htonl() und ntohl()

Das fehlende htonll() und ntohll() zum long long (64bit) könnte leicht aus diesen beiden gebaut werden. Sehen Sie sich zum Beispiel diese Implementierung an.

Aktualisierung-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 könnte irgendwo in den verwendeten Unions zusätzliche Bytes einführen. 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 der *ll Funktionen: https://stackoverflow.com/a/955980/694576

Update-0.1:

Aus dem Kommentar von bames53 tendiere ich zu dem Schluss, dass das erste oben verlinkte Beispiel nicht mit C++, sondern nur mit C verwendet werden soll.

Aktualisierung-1:

Um die Funktionalität der *ll unter Linux funktioniert dieser Ansatz möglicherweise der 'beste'.

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, sich mit Byte-Sex zu befassen.

Es ist jedoch viel besser, das Problem zu umgehen, indem Sie Ihre Daten in ASCII oder ähnlichem ausgeben. Es braucht etwas mehr Platz und überträgt etwas langsamer über das Netz, aber die Einfachheit und Zukunftssicherheit lohnt sich.

Eine andere Möglichkeit besteht darin, Ihre Ints und Shorts numerisch auseinander zu nehmen. Also & 0xff und wiederholt durch 256 teilen. Dies ergibt ein einziges Format auf allen Architekturen. Aber ASCII hat immer noch die Nase vorn, weil es einfacher zu debuggen ist.

Click to rate this post!
[Total: 0 Average: 0]



Anderer Beitrag

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.