Digitális és informatikai

Bájtsorrend: ugyanaz a két bájt két különböző számot adhat

A 12 és 34 hexadecimális bájt együtt 4660-at vagy 13 330-at is jelenthet, a bájtsorrendtől függően. Két példán ellenőrizzük a helyiértékeket, a mezőhatárokat és az importhoz szükséges leírást.

Dajka Gábor4 perc olvasás
Dajka Gábor portréja sárga háttérrel
Dajka Gábor

Egy mérőeszköz két bájton küld egy számot. A fájlban látható adatok épek, a fogadó alkalmazás mégis váratlanul nagy értéket mutat. Ilyenkor a bájtsorrend eltérése is lehetséges ok. Többbájtos egész számnál meg kell állapodni abban, hogy az alacsonyabb vagy a magasabb helyiértékű bájt érkezik előbb.

Piros adatkábel csatlakozója egy számítógép mellett
Illusztráció: Pixabay · Felhasználási feltételek

A következő példák kétbájtos, előjel nélküli egész számokról szólnak. A bájtokat hexadecimálisan, vagyis tizenhatos számrendszerben írjuk le. Egy bájtot két hexadecimális számjegy jelölhet, például 12 vagy 34; ezek itt nem tízes számrendszerű feliratok.

Két sorrend, azonos bájtmennyiség

Big-endian sorrendben a magasabb helyiértékű bájt áll elöl. Little-endian sorrendben az alacsonyabb helyiértékű bájt az első. Egy bájt 256 különböző értéket vehet fel, ezért két bájt összeállításakor a magasabb helyiértékű bájt értékét 256-tal szorozzuk.

Ha az első bájt tízes számrendszerű értéke a, a másodiké b, akkor:

  • Big-endian érték = a × 256 + b.
  • Little-endian érték = b × 256 + a.

Az MDN getUint16 dokumentációja két bájt előjel nélküli egész számként történő olvasását és a bájtsorrend kiválasztását is leírja. Az adott művelet alapértelmezését a dokumentációból kell ellenőrizni; a számítógép processzorának típusa önmagában nem határozza meg egy fájl formátumát.

A 12 34 bájtpár kiszámítása

A hexadecimális 12 tízes számrendszerben 1 × 16 + 2 = 18. A hexadecimális 34 értéke 3 × 16 + 4 = 52. A fájlban tehát először egy 18-as, majd egy 52-es értékű bájt következik.

Big-endian olvasással 18 × 256 + 52 = 4660. Little-endian olvasással 52 × 256 + 18 = 13 330. Mindkét eredmény belefér a kétbájtos előjel nélküli 0–65 535 tartományba. A tartományellenőrzés ezért önmagában nem veszi észre a felcserélt értelmezést.

Ha az eszköz skálája például száz egységnyi nyers értéket rendel egy mérési egységhez, a két értelmezés 46,60 és 133,30 egységet ad. A skála ebben a bekezdésben hipotetikus. A helyes számot az eszköz formátumleírása és ismert bemenettel készített próba dönti el.

Második példa a legkisebb helyiértékkel

A bájtsorozat most 01 00, továbbra is hexadecimálisan. Az első bájt értéke egy, a másodiké nulla. Big-endian olvasással 1 × 256 + 0 = 256, little-endian olvasással 0 × 256 + 1 = 1.

Ez jó próbaadat, mert a különbség egyértelmű. A 00 00 vagy FF FF bájtpár mindkét sorrendben ugyanazt az előjel nélküli eredményt adja: nullát, illetve 65 535-öt. Csak ilyen szimmetrikus adatokkal tesztelve a bájtsorrendi hiba rejtve maradhat.

Egyetlen bájtos egész mezőnél nincs két bájt, amelynek sorrendjét felcserélhetnénk. A bájtsorrend a többszörös bájtméretű értékek összerakásának kérdése. A bájton belüli bitjelölés és a kommunikáció fizikai bitküldési sorrendje ettől külön fogalom.

A bájtsorrend mellett a mezőhatár is számít

A helyes sorrenddel is hibás értéket olvashatsz, ha egy bájttal rossz helyen kezdődik a mező. Egy kétbájtos szám előtt állhat állapotjelző, hosszmező vagy más adat. A fogadónak a kezdő pozíciót és a mező hosszát is ismernie kell.

Az előjel külön döntés. Ugyanaz a kétbájtos minta előjel nélküli vagy előjeles számként eltérő jelentést kaphat. A sorrend javítása ezért még nem teljes importellenőrzés. Az érték skálázása, az eltolás és a különleges hibakódok kezelése is a dokumentált formátumhoz tartozik.

Az adatmennyiség-átváltó a bájt- és bitmennyiségek ellenőrzéséhez adhat általános segítséget. A két bájt 16 bitet jelent, de az értelmezett szám meghatározásához a mezőleírás további adatai is szükségesek.

Szöveges hexadecimális alak vagy nyers bájt?

A képernyőn megjelenített 12 34 felirat a két bájt olvasható jelölése. Ha ezt szövegfájlba írod, a karakterek és a szóköz külön karakterkódokként tárolódnak; a szöveg nem automatikusan a két eredeti nyers bájt. Import előtt ezt is tisztázni kell.

Egy jó próbasor tartalmaz eltérő bájtokat, nullát, határértéket és ismert mérési értéket. A nyers bájtokat őrizd meg az értelmezett szám mellett a tesztben, így a hibás sorrend, rossz kezdőpozíció és hibás skálázás külön vizsgálható.

Tudáspróba

1. Mennyi a hexadecimális 12 34 értéke big-endian olvasással?

  • A: 4660.
  • B: 1234.
  • C: 13 330.

2. Mennyi a 01 00 bájtpár little-endian, előjel nélküli értéke?

  • A: 256.
  • B: 1.
  • C: 65 535.

3. Miért gyenge önmagában a 00 00 próba a bájtsorrend ellenőrzésére?

  • A: Két bájt túl rövid egy számhoz.
  • B: Nullát soha nem szabad továbbítani.
  • C: Mindkét sorrend ugyanazt a nulla értéket adja.

Megoldások és következő lépés

1. A. A bájtok tízes értéke 18 és 52, így 18 × 256 + 52 = 4660.

2. B. Little-endian sorrendben az első bájt az alacsony helyiértékű, tehát 0 × 256 + 1 = 1.

3. C. Az azonos bájtok felcserélése nem változtatja meg a számot.

0–1 pont: váltsd át külön a 12 és 34 hexadecimális bájtot. 2 pont: számold végig a 01 00 párt mindkét sorrendben. 3 pont: készíts mezőleírást kezdőpozícióval, hosszal, előjellel, sorrenddel és skálával, majd eltérő bájtokat tartalmazó adattal ellenőrizd.

További cikkek

Kapcsolódó olvasnivalók

Gyorskereső

Kalkulátorok és útmutatók keresése

↑↓ választásEnter megnyitásEsc bezárás