Wie eine 24-Bit-Nachricht, nachdem auf einer Big-Endian-Maschine von einem 4-Byte-Integer Lese (C) zu schreiben?

StackOverflow https://stackoverflow.com/questions/3965873

  •  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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top