Adatábrázolás › Endianitás: a bájtok sorrendje

Haladó kiegészítés · középiskola és egyetemi alapozó

Endianitás: a bájtok sorrendje

Ugyanazt a több bájtos értéket két tárolási sorrendben olvasod ki. Megkülönbözteted a bájtsorrendet a bájton belüli bitek sorrendjétől.

  • Adatábrázolás
  • Saját feladat
  • Önellenőrzés
Anime tanuló a tojás két végét összehasonlító szemléltető helyzetben.

A lecke végére

  • memóriacímenként kiolvasod a több bájtos értéket
  • felismered a big-endian és little-endian sorrendet
  • helyesen értelmezed a bájtsorrendet és a BOM-jelzést

Amit már tudsz

  • tudod, hogy egy bájt nyolc bit
  • ismered a hexadecimális számjegyeket

Melyik bájt kerül a kisebb címre?

Az endianitás a több bájtból álló adategységek bájtsorrendje. Big-endian sorrendben a legnagyobb helyiértékű bájt kerül a legkisebb memóriacímre; little-endian sorrendben a legkisebb helyiértékű. A „nagy” itt a helyiértékre utal, nem a bájt számértékére.

A 0x4A3B2C1D érték tárolása növekvő címeken
MemóriacímBig-endianLittle-endian
1004A1D
1013B2C
1022C3B
1031D4A

A bájtokon belüli biteket nem fordítjuk meg. A 4A bájt mindkét esetben 4A marad.

A formátum dönti el az értelmezést

A processzor és a fájlformátum bájtsorrendje eltérhet. A programnak a formátum előírását kell követnie. Nincs minden adatra érvényes alapértelmezett „Intel-formátum”.

Ugyanaz a két bájt
01 00növekvő címeken
256big-endian, előjel nélküli 16 bit
1little-endian, előjel nélküli 16 bit
A két bájt azonos, az eredmény az értelmezési szabálytól függ.

Az internetes protokollokban számos több bájtos egész mező big-endian, úgynevezett network byte order sorrendű. Egy hálózaton továbbított szöveg vagy teljes fájl ettől még nem vált automatikusan big-endianné.

Szövegkódolás és BOM

UTF-16 esetén a kezdeti FE FF big-endian, a FF FE little-endian sorrendet jelez. A BOM jelenléte a konkrét formátumtól és protokolltól függ; nem minden szövegfájl tartalmazza.

UTF-32 esetén a megfelelő négybájtos jelek 00 00 FE FF és FF FE 00 00. UTF-8-nál nincs bájtsorrendi választás; az EF BB BF kezdeti jelzés előfordulhat kódolási aláírásként, de nem endianitást választ.

A név Jonathan Swift tojástörési vitájára utal. Ez emlékeztető hasonlat; a műszaki feladatban a bájtok helyiértékét és memóriacímét kell nézni.

Olvasd ki kétféleképpen

Készíts memóriatérképet

Növekvő címeken ezt a négy bájtot látod: 78 56 34 12. Melyik 32 bites hexadecimális értéket adja little-endian, és melyiket big-endian értelmezésben?

Előbb próbáld meg, utána ellenőrizd

Little-endian: 0x12345678. Big-endian: 0x78563412. A little-endian érték felírásakor a bájtok sorrendjét fordítjuk meg, a bájtok két hexadecimális számjegyét együtt hagyjuk.

Ellenőrizd a munkádat

Nézd át a memóriatérképedet, és válaszolj a kérdésekre a leírás visszaolvasása nélkül.

  • A memóriacímeket növekvő sorrendben írtad fel?
  • Big-endiannál a legnagyobb helyiértékű bájt került a legkisebb címre?
  • Teljes bájtokat (két hexadecimális számjegyet) mozgattál, nem egyes számjegyeket?
  • A bájtokon belül a bitek sorrendje változatlan maradt?
  • Meg tudod mondani, mit jelez az FF FE egy UTF-16 szövegfájl elején?
Hol találkozol vele a valóságban?

A mai asztali és laptop-processzorok többsége (x86-64), valamint a telefonokban gyakori ARM-processzorok jellemzően little-endian módon dolgoznak. Az internetes protokollok fejlécében a több bájtos számok viszont big-endian (network byte order) sorrendűek. Ezért ha egy program adatot küld a hálózatra vagy egy adott formátumú fájlba ír, átalakítást kell végeznie. Az endianitás hibája jellegzetes tünet: egy 1-es érték 16 777 216-nak (0x01000000) olvasódik.

Gyakori hiba

A little-endian sorrend nem a teljes szám „visszafelé írása”. A 12 34 56 78 megfordítva bájtonként 78 56 34 12, és nem 87 65 43 21.

Elakadtál a hexadecimális jegyekkel? Ismételd át a Helyiérték és hatvány leckét, ahol a 16-os alap is szerepel.

Források és továbbolvasás