Was Endianness ist
Eine mehrbytige Zahl muss Byte für Byte gespeichert werden, und dafür gibt es zwei sinnvolle Reihenfolgen. Big-Endian legt das höchstwertige Byte an die niedrigste Adresse, so wie wir Zahlen schreiben: 0x12345678 wird zu 12 34 56 78. Little-Endian legt das niedrigstwertige Byte zuerst ab: 78 56 34 12. x86, x86-64 und (standardmäßig) ARM sind Little-Endian; Netzwerkprotokolle (IP, TCP, DNS), Java-Klassendateien, PNG und die meisten Großrechnerformate sind Big-Endian, weshalb „Network Byte Order“ Big-Endian bedeutet.
Wann es eine Rolle spielt
Innerhalb eines Programms auf einer Maschine nie: Die CPU erledigt es. Es zählt in dem Moment, in dem Bytes eine Grenze überschreiten: ein Struct in eine Datei schreiben, ein Paket lesen, über SPI mit einem Sensor sprechen, ein binäres Dateiformat abbilden oder einen Hex-Dump interpretieren. 78 56 34 12 in einem Dump von x86-Speicher zu lesen und für 0x78563412 zu halten, ist der klassische Fehler.
Die Funktionen
| Sprache | Host → Netzwerk (Big-Endian) | Beliebiger Tausch |
|---|---|---|
| C | htonl, htons, htobe64 | __builtin_bswap32 |
| Go | binary.BigEndian.PutUint32 | bits.ReverseBytes32 |
| Python | struct.pack('>I', x) | x.to_bytes(4, 'little') |
| Rust | x.to_be_bytes() | x.swap_bytes() |
| JavaScript | DataView.setUint32(o, x) | DataView mit littleEndian=true |
UTF-16 und die BOM
Text in UTF-16 hat dasselbe Problem, weshalb Dateien mit einer Byte-Order-Mark beginnen können: FE FF für Big-Endian, FF FE für Little-Endian. UTF-8 hat keine Bytereihenfolge und braucht keine BOM.
Fragen
Welche Endianness verwendet mein Computer?
Fast sicher Little-Endian: Alle x86- und x86-64-CPUs sind es, und ARM (Smartphones, Apple Silicon, Raspberry Pi) läuft in der Praxis Little-Endian. Big-Endian lebt in Netzwerkprotokollen und einigen Embedded- und Mainframe-Systemen weiter (s390x, ältere PowerPC, SPARC).
Warum ist das Netzwerk Big-Endian?
Historische Konvention aus dem frühen ARPANET und den IBM/Motorola-Maschinen, festgeschrieben in RFC 1700. Jedes Protokoll seither folgt ihr, deshalb hat jede Socket-API htons/htonl.
Beeinflusst Endianness die Bits innerhalb eines Bytes?
Nein. Ein Byte wird immer als Ganzes gelesen. Die Bitreihenfolge spielt nur bei seriellen Protokollen und manchen CRC-Algorithmen eine Rolle und ist eine eigene Frage.
Wie erkenne ich die Endianness zur Laufzeit?
Eine 1 in eine 32-Bit-Ganzzahl schreiben und das erste Byte ansehen: 1 bedeutet Little-Endian. In der Praxis sind explizite Konvertierungsfunktionen besser, damit der Code überall funktioniert.
Was ist Middle-Endian?
Die PDP-11 speicherte 32-Bit-Werte als zwei Little-Endian-16-Bit-Hälften in Big-Endian-Reihenfolge (34 12 78 56). Das ist ausgestorben, aber der Begriff wird noch für Datumsformate wie MM-DD-YYYY verwendet.