Einzelnen Beitrag anzeigen

OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#8

Re: [Ansi C] Long in Bytes aufteilen

  Alt 9. Okt 2007, 19:22
Je nachdem, was "steht so im Speicher" bedeutet, kann der Union-Ansatz unter Umständen verkehrte Ergebnisse liefern. Der Shift-Ansatz hingegen funktioniert auf jedem System korrekt, ist jedoch geringfügig langsamer. Sollte der Union-Ansatz korrekte Ergebnisse liefern, kommt als Alternative auch ein Cast in Frage:
Code:
uint8_t* bytes = reinterpret_cast<uint8_t*>(&input); // C++
bzw.
uint8_t* bytes = (uint8_t*)&input; /* C */
Wenn du zur Kompilierzeit die Byte-Reihenfolge im Speicher kennst, kannst du auch den Cast-Ansatz benutzen und dann je nachdem ob Big- oder LittleEndian das Array vorwärts oder rückwärts durchlaufen.

Noch ein Tipp zu dem Verodern mit 255: Irgendwann, besonders wenn du mehr oder weniger als 8 Bit benötigst, wirst du dich mit der 255 unter Umständen selbst ins Fleisch schneiden. Lieber gleich 0xFF, da wird auf den ersten Blick klar, was passiert. (Bei C sind die Chancen realistisch, dass dein Compiler Binärdarstellung beherrscht, das ist dann eventuell auch noch eine Alternative).

Zitat:
x = x << 8 | y
Ich kann mich dunkel daran erinnern, dass die Shift-Operatoren in C++ deshalb als Stream-Operatoren missbraucht werden, weil sie recht spät ausgewertet werden. Dein Ausdruck wäre also mit Klammern sicherer, und gerade bei diesen ganzen Schiebe- und Verund- und -oderungsoperationen kommt man so leicht durcheinander, dass man lieber ordentlich klammern sollte.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat