Šta je endianness
Višebajtni broj mora da se čuva bajt po bajt, a postoje dva razumna redosleda. Big-endian stavlja najznačajniji bajt na najnižu adresu, onako kako pišemo brojeve: 0x12345678 postaje 12 34 56 78. Little-endian stavlja najmanje značajan bajt prvi: 78 56 34 12. x86, x86-64 i (podrazumevano) ARM su little-endian; mrežni protokoli (IP, TCP, DNS), Java class datoteke, PNG i većina formata sa velikih sistema su big-endian, zbog čega „mrežni redosled bajtova“ znači big-endian.
Kada je bitan
Unutar jednog programa na jednoj mašini, nikad: CPU to rešava. Postaje bitan onog trenutka kada bajtovi pređu granicu: upis strukture u datoteku, čitanje paketa, komunikacija sa senzorom preko SPI-ja, mapiranje binarnog formata datoteke ili tumačenje heks ispisa. Pročitati 78 56 34 12 u ispisu x86 memorije i pomisliti da to znači 0x78563412 je klasična greška.
Funkcije
| Jezik | Host → mreža (big-endian) | Proizvoljna zamena |
|---|---|---|
| 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 sa littleEndian=true |
UTF-16 i BOM
Tekst u UTF-16 ima isti problem, zbog čega datoteke mogu da počnu oznakom redosleda bajtova (BOM): FE FF za big-endian, FF FE za little-endian. UTF-8 nema redosled bajtova i ne treba mu BOM.
Pitanja
Koji endianness koristi moj računar?
Gotovo sigurno little-endian: svi x86 i x86-64 procesori su takvi, a ARM (telefoni, Apple Silicon, Raspberry Pi) u praksi radi kao little-endian. Big-endian opstaje u mrežnim protokolima i nekim ugrađenim i mainframe sistemima (s390x, stariji PowerPC, SPARC).
Zašto je mreža big-endian?
Istorijska konvencija iz ranog ARPANET-a i IBM/Motorola mašina, zapisana u RFC 1700. Svaki protokol od tada je sledi, pa svaki socket API ima htons/htonl.
Da li endianness utiče na bitove unutar bajta?
Ne. Bajt se uvek čita kao celina. Redosled bitova se javlja samo u serijskim protokolima i nekim CRC algoritmima i to je zasebno pitanje.
Kako da otkrijem endianness u vreme izvršavanja?
Upišite 1 u 32-bitni ceo broj i pogledajte prvi bajt: 1 znači little-endian. U praksi radije koristite eksplicitne funkcije za konverziju da bi kod radio svuda.
Šta je middle-endian?
PDP-11 je čuvao 32-bitne vrednosti kao dve little-endian 16-bitne polovine u big-endian redosledu (34 12 78 56). Izumro je, ali se termin i dalje koristi za formate datuma poput MM-DD-YYYY.