2012-10-18 8 views
5

Wir müssen 3 Hardware-Plattformen unterstützen - Windows (Little Endian) und Linux Embedded (große und kleine Endian). Unser Datenstrom ist abhängig von der verwendeten Maschine und die Daten müssen in Bitfelder aufgeteilt werden.Big Endian und Little Endian Unterstützung für Byte Ordering

Ich möchte ein einzelnes Makro (wenn möglich) schreiben, um das Detail zu abstrahieren. Unter Linux kann ich bswap_16/bswap_32/bswap_64 für Little Endian-Konvertierungen verwenden.

Allerdings kann ich dies nicht in meinen Visual C++ enthalten finden.

Gibt es eine generische integrierte für beide Plattformen (Windows und Linux)?

Wenn nicht, was kann ich in Visual C++ verwenden, um Byte-Swapping durchzuführen (außer, es selbst zu schreiben - in der Hoffnung, dass eine Maschine für das integrierte System optimiert ist)?

Danke.

Antwort

12

Auf beiden Plattformen Sie

haben

für short (16bit): htons() und ntohs()

für long (32bit): htonl() und ntohl()

Das fehlende htonll() und ntohll() für long long (64bit) konnte leicht von diesen beiden gebaut werden. Siehe this implementation for example.

-Update-0:

Für das obige Beispiel Simon Richter verknüpft erwähnt in einem Kommentar, dass es nicht unbedingt arbeiten muss. Der Grund dafür ist: Der Compiler fügt möglicherweise zusätzliche Bytes in die verwendeten Verbindungen ein. Um das zu umgehen, müssen die Gewerkschaften gepackt werden. Letzteres könnte zu Leistungseinbußen führen.

Also hier ist eine andere sichere Methode, die *ll Funktionen bauen: https://stackoverflow.com/a/955980/694576

-Update-0,1:

Von bames53' s Kommentar Ich neige dazu, das erste Beispiel oben verlinkte abschließen dürfen nicht verwendet werden mit C++, aber nur mit C.

-Update-1:

Um die functionallity der *ll Funktionen auf Linux this approach might be the ' best' zu erreichen.

+0

Diese Funktionen sind relativ universell für jedes Betriebssystem, das Netzwerke (z. B. Internet) versteht. Einige der modernsten Betriebssysteme. –

+0

Beachten Sie, dass ihre Beispielimplementierung mit "union" nicht garantiert funktioniert. –

+0

Ja, Sie haben Recht die Gewerkschaften sollten gepackt werden. Danke, dass du darauf hingewiesen hast. Bitte beachten Sie das Update zu meiner Antwort. @SimonRichter – alk

2

Nicht die gleichen Namen, aber die gleiche Funktionalität tut exist.

2

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 braucht ein wenig mehr Platz, und es überträgt etwas langsamer über das Netz, aber die Einfachheit und Zukunftsfähigkeit ist es wert.

Eine andere Möglichkeit ist, Ihre Int's und Short's numerisch auseinander zu nehmen.Also du & 0xff und teile durch 256 wiederholt. Dies ergibt ein einziges Format auf allen Architekturen. Aber ASCII hat immer noch die Nase vorn, weil es einfacher ist mit zu debuggen.

+0

Würde gerne, aber wir kontrollieren nicht die Übertragung. Es sind Daten, die von einem speziellen Hardware-Gerät eingelesen werden und die Bytes von dort verarbeiten müssen. – user626201

Verwandte Themen