portable / ohne Vorzeichen Byte-Besetzung, C ++
-
16-09-2019 - |
Frage
Ich verwende in unsigned Byte unterzeichnet (int8_t) gegossen Byts zu packen.
uint32_t(uint8_t(byte)) << n
Das funktioniert mit GCC auf Intel Linux. Ist das tragbare für andere Plattformen / Compilern, zum Beispiel PowerPC? Gibt es einen besseren Weg, es zu tun? bitset ist nicht möglich in meinem Fall. Ich verwende stdint über boost
Lösung
Wenn Sie boost/cstdint.hpp
von der Boost-Integer-Bibliothek verwenden, dann ja, sind die typedefs portable (Cross-Plattform). Der boost/cstdint.hpp
Header gemeint C99 stdint.h Funktionalität in C ++ zu implementieren.
Von der Boost-Dokumentation :
Der Header Die stellt die typedef nützlich für Schreiben portablen Code das erfordert bestimmte ganzzahlige Breiten. Alle typedef des im Namensraum boost ist.
Andere Tipps
Es ist nicht tragbar, da die Typen uint32_t und uint8_t sind nicht Teil der C ++ Standards. Alle derartige maipulations sind von Natur aus der Umsetzung abhängig.
In der Praxis ja es ist höchstwahrscheinlich auf den meisten anderen Plattformen zur Arbeit zu gehen auftreten (vor allem, wenn Boost es portiert). wenn Sie diese gepackten Werte in Dateien oder Netzwerk-Sockets jedoch schreiben, werden Sie mit Byte-Reihenfolge (Ihr Beispiel für PowerPC hat Big-Endian-Byte-Reihenfolge während Intel haben Little-Endian) zu tun haben. In dieser Hinsicht wird der Code anders verhalten auf verschiedene Hardware-Architekturen.