Wie eine 24-Bit-Nachricht, nachdem auf einer Big-Endian-Maschine von einem 4-Byte-Integer Lese (C) zu schreiben?
-
09-10-2019 - |
Frage
Ich bin den Aufbau einer Nachricht, die eine 24-Bit-Nummer über das Netzwerk zu senden. Für Little-Endian-Maschinen, ist der Code (ptr ist der Zeiger auf den Nachrichtenpuffer):
*ptr++ = (num >> 16) & 0xFF;
*ptr++ = (num >> 8) & 0xFF;
*ptr++ = (num) & 0xFF;
(Also, wenn NUM0, num1, num2 und num3 ist der einzelne Bytes num bildet, würde die Nachricht als num2|num1|num0
codiert werden.)
Was ist der Code für die Codierung num2|num1|num0
auf einer Big-Endian-Maschine sein sollte?
Lösung
Der Code ist tragbar, unabhängig von Endian. Die Shift-Operatoren >>
<<
Arbeit mit den Werten, nicht mit der Darstellung.
Andere Tipps
Die Frage ist hier, in welcher Byte-Reihenfolge soll die Nachricht gesendet / konstruiert? Denn ob Sie auf einem kleinen oder Big-Endian-Maschine sind keine Rolle in Bezug auf num
, wie Sie bereits num
in einzelne Bytes in einem Endian-agnostischen Weise geteilt wird.
Der Code, den Sie speichert 24 Bits von num
in Big-Endian (auch bekannt als Netzwerk-Byte-Reihenfolge) geschrieben haben. Also, wenn das ist, was Sie wollen, sind Sie bereits getan. Wenn Sie es in großen kleinen stattdessen speichern möchten, nur die Reihenfolge umkehren:
*ptr++ = (num) & 0xFF;
*ptr++ = (num >> 8) & 0xFF;
*ptr++ = (num >> 16) & 0xFF;
In der empfangenden Maschine, unabhängig von Endian-ness, wenn man sie in derselben Reihenfolge empfangen, wie sie in ptr gespeichert sind, montieren sie wie folgt aus:
num = (ptr[0] << 16) + (ptr[1] << 8) + (ptr[2]);
int main(int argc, char** argv) {
int a, b;
a = 0x0f000000; // Contain 32 bit value
printf("before = %d\n", a);
b = a & (~0xff000000); // convert the last 8 bits to zero so we got only 24 bit value in b
printf("After = %d\n", b);
return (EXIT_SUCCESS);
}
Es gibt eine Zahl, die eine 32-Bit-Wert, sondern Anzahl b enthält nur 24 Bits enthält, aus den am wenigsten signifikanten Stelle zu starten. Und das nicht auf endianness abhängt, weil Bitoperatoren nicht Arbeit mit Speicherrepräsentation.
So können Sie
num = num & (~0xff000000);
, um den letzten 24-Bit-Wert erhalten.