Sobes.tech
Junior

Was wissen Sie über die Notationen Big Endian, Little Endian und Middle Endian?

sobes.tech KI

Antwort von AI

Big Endian: Das höchstwertige (größte) Byte einer Mehrbyte-Zahl wird an der niedrigsten Speicheradresse abgelegt, und das niedrigste Byte an der höchsten. Little Endian: Das niedrigste (bedeutendste) Byte einer Mehrbyte-Zahl wird an der niedrigsten Speicheradresse abgelegt, und das höchstwertige Byte an der höchsten. Middle Endian: ist keine allgemein anerkannte Notation. Man versteht darunter manchmal Fälle, in denen die Byte-Reihenfolge von Big Endian und Little Endian abweicht, z.B. bei der Verarbeitung von Mehrbyte-Zahlen in 2-Byte-Blöcken.

Beispiel für eine 4-Byte-Zahl 0x12345678:

Adresse Big Endian Little Endian
0x1000 0x12 0x78
0x1001 0x34 0x56
0x1002 0x56 0x34
0x1003 0x78 0x12

Die meisten modernen Prozessoren (Intel, AMD) verwenden Little Endian. Netzwerkprotokolle verwenden in der Regel Big Endian (sogenannter "Netzwerk-Byte-Reihenfolge").

Um die Endianness des Systems zu überprüfen, kann man folgendes machen:

#include <iostream>

int main() {
    int x = 1;
    // Erstellen eines Zeigers auf ein Byte und Überprüfung des ersten Bytes der Zahl 1 (0x00000001)
    if (*reinterpret_cast<char*>(&x) == 1) {
        std::cout << "Little Endian" << std::endl;
    } else {
        std::cout << "Big Endian" << std::endl;
    }
    return 0;
}

Zum Konvertieren zwischen Byte-Reihenfolgen in C++ werden Funktionen aus <arpa/inet.h> (für Netzwerk-Byte-Reihenfolge) oder <endian.h> (allgemeiner) verwendet.

#include <arpa/inet.h> // Für htons, htonl, ntohs, ntohl

int main() {
    uint16_t host_short = 0x1234;
    uint32_t host_long = 0x12345678;

    // Konvertierung von Host-Byte-Reihenfolge zu Netzwerk-Byte-Reihenfolge (Big Endian)
    uint16_t network_short = htons(host_short);
    uint32_t network_long = htonl(host_long);

    // Konvertierung von Netzwerk-Byte-Reihenfolge zu Host-Byte-Reihenfolge
    uint16_t back_to_host_short = ntohs(network_short);
    uint32_t back_to_host_long = ntohl(network_long);

    return 0;
}