Byte sorrend

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2018. november 13-án felülvizsgált verziótól ; az ellenőrzések 39 szerkesztést igényelnek .

A modern számítástechnikai és digitális kommunikációs rendszerekben az információkat általában bájtok sorozataként ábrázolják . Abban az esetben, ha a szám nem ábrázolható egy bájttal, akkor számít, hogy a bájtok milyen sorrendben kerülnek a számítógép memóriájába, illetve milyen sorrendben kerülnek továbbításra kommunikációs vonalakon. A bájtsorrend kiválasztása gyakran önkényes, és csak konvenciók határozzák meg.

Általában egy 255-nél nagyobb M szám ábrázolásához (itt - az egy bájtba  írható maximális egész szám ), több bájtot (n) kell használni. Ebben az esetben az M számot a 256-os pozíciószámrendszerbe írjuk :

A 0 és 255 közötti egész számok halmaza az M -et alkotó bájtok sorozata . Ebben az esetben az M szám alsó bájtjának és  - magas bájtjának nevezzük .

Mivel a számítógép nem címez egyedi biteket (ezek csak bitmezőkön keresztül érhetők el ) , a bitek sorrendje egy bájton csak az adattárolás és adatátvitel fizikai megszervezésében fontos, készülékenként eltérő lehet, és általában nem alkalmazásprogramozónak kell.

Felvételi lehetőségek

Rendezés a legidősebbtől a legfiatalabbig

Rendezés a legidősebbtől a legfiatalabbig ( angol  big-endian  - a nagy végtől): . Ez a sorrend hasonló a szokásos írási sorrendhez (például , arab számokkal ) "balról jobbra", például a százhuszonhárom számot olyan sorrendben írják, mint 123 . Ugyanebben a sorrendben szokás bájtokat írni a műszaki és oktatási irodalomban, kivéve, ha más sorrendet kifejezetten jeleznek.

Ez a sorrend a TCP/IP protokollok szabványos, adatcsomag - fejlécekben és számos magasabb szintű protokollban használatos, amelyeket TCP/IP-n keresztüli használatra terveztek. Ezért a magastól az alacsonyig terjedő bájtok sorrendjét gyakran "hálózati bájtsorrendnek" ( eng.  network byte order ) nevezik. Ezt a bájtsorrendet az IBM 360 / 370/390, SPARC , Motorola 68000 processzorok használják (innen a harmadik név - Motorola byte order , eng.  Motorola byte order ).

Ezzel a bájtsorrenddel kényelmes a karakterláncok összehasonlítása (összehasonlíthatja őket egész mezőkkel - nagyobb kapacitású részekkel, amelyek mindegyike egyszerre több karaktert tartalmaz).

A magastól az alacsonyig terjedő bájtsorrend szintén számos fájlformátumban használatos  – például PNG , FLV , EBML , JPEG .

Rendezés a legfiatalabbtól a legidősebbig

Rendezés a legfiatalabbtól a legidősebbig ( eng.  little-endian  - a kicsi végétől):

Ez a fordítottja a számok arab számokkal történő írásának szokásos sorrendjének , például a százhuszonhárom számot olyan sorrendben írják, mint 321 . Más szóval, ez a sorrend hasonló a jobbról balra haladó írásszabályhoz.

Ezt az írási sorrendet az x86 architektúrájú processzorokkal rendelkező személyi számítógépek memóriája veszi át , ezért néha Intel bájtsorrendnek is nevezik (az x86 architektúrát létrehozó cég neve után). A modern x86 processzorok lehetővé teszik az egy-, két-, négy- és nyolcbájtos operandusokkal való munkát. Ebben a bájt sorrendben nagyon kényelmes, hogy amikor az operandus mérete (bájtjainak száma) nő, az első bájt értéke változatlan marad: 3210 → 3210'0000. A magasról az alacsonyra való sorrendben az érték változna, például: 0123 → 0000'0123;

Az x86 mellett ezt a bájtsorrendet használják a VAX architektúrákban (innen az angol másik elnevezése.  VAX byte order [1] ), a DEC Alpha -ban és sok másban.

Ezenkívül a "legalacsonyabbtól a legmagasabbig" sorrendet használják az USB- , PCI- , GUID-partíciós táblákban , ezt ajánlja a FidoNet . De általában a little-endian konvenció kevesebb platformközi protokollt és adatformátumot támogat, mint a big-endian .

Váltható sorrend

Számos processzor képes működni alacsony-magas sorrendben és fordítva is, mint például az ARM (alapértelmezett a little endian), a PowerPC (kivéve a PowerPC 970 ), a DEC Alpha , a MIPS , a PA-RISC és az IA-64 . A bájtsorrendet általában szoftver választja ki az operációs rendszer inicializálása során , de az alaplapon lévő hardveres jumperekkel is kiválasztható. Ebben az esetben helyesebb az operációs rendszer szintjén való végességről beszélni. A kapcsolható endiannesst néha angolnak is nevezik .  bi-endian .

Vegyes rendelés

A vegyes (kombinált, hibrid) bájtsorrendet ( angol  közép-endian) néha használják olyan számokkal, amelyek hossza meghaladja a gépszót . A számot gépi szavak sorozata képviseli , amelyek az adott architektúra számára természetes formátumban vannak írva, de maguk a gépszavak fordított sorrendben következnek.

A VAX és ARM processzorok vegyes ábrázolást használnak hosszú valós számokhoz.

Példa

A következő példa egy 4 bájtos szám elhelyezését írja le a számítógép RAM-jában, amely 32 bites szóként és bájtonként is elérhető.

Minden szám hexadecimális számrendszerben van írva.

Szám: 0xA1B2C3D4
Teljesítmény
Rendeljen a legfiatalabbtól a legidősebbig (kis-endian)
Rendelés a legidősebbtől a legfiatalabbig (big-endian)
A PDP-11-ben elfogadott rendelet (PDP-endian)

Endianitás meghatározása

Egy adott gépen a bájtsorrend (endianness) a C programmal (testbyteorder.c) határozható meg:

#include <stdio.h> #include <stdint.h> int main () { uint16_t x = 0x0001 ; printf ( "%s-endian \n " , * (( uint8_t * ) & x ) ? "little" : "nagy" ); }

Futási eredmények nagyszabású gépen ( SPARC ):

$ uname -m sparc64 $ gcc -o testbyteorder testbyteorder.c $ ./testbyteorder big-endian

Futtatási eredmények egy kis végű gépen ( x86 ):

$ uname -m i386 $ gcc -o testbyteorder testbyteorder.c $ ./testbyteorder kis-endian

Valós számok

A valós számok tárolása az endianitástól is függhet. Például x86 esetén az IEEE 754 formátumok előjellel és kitevővel vannak magas bájtokban.

Unicode

Ha a Unicode UTF-16 vagy UTF-32 formátumban van írva , akkor az endianness már jelentős. A bájtok sorrendjének jelzésének egyik módja a Unicode-szövegekben a BOM speciális karakter előtagja ( byte order mark , byte order mark , U+FEFF) – ennek a karakternek a "fordított" változata (U+FFFE) nem létezik. és szövegekben nem megengedett.

Az U+FEFF karaktert az UTF-16-ban a 0xFE 0xFF (big-endian) vagy a 0xFF 0xFE (little-endian) bájtsorozat, az UTF-32-ben pedig a 0x00 0x00 0xFE 0xFF (big-endian) vagy 0xFF 0xFE 0x00 0x00 (kis -endian).

Kompatibilitási és konverziós problémák

Egy többbyte-os szám számítógép memóriájából fájlba írásához vagy hálózaton keresztüli átviteléhez konvenciók szükségesek arra vonatkozóan, hogy melyik bájt kerül továbbításra először. A közvetlen írás abban a sorrendben, amelyben a bájtok a memóriacellákban helyezkednek el, problémákhoz vezet mind az alkalmazások platformról platformra való átvitelekor, mind a rendszerek közötti hálózati adatcserében.

A hálózati bájtsorrend (amely mindig big-endian) és a gazdagép bájtsorrendje közötti konvertáláshoz a POSIX szabvány a , , , függvényeket biztosítja  :  htonl()htons()ntohl()ntohs()

  • uint32_t htonl(uint32_t hostlong); - a 32 bites előjel nélküli értéket helyi bájtsorrendből hálózati bájtsorrendbe konvertálja;
  • uint16_t htons(uint16_t hostshort); - a 16 bites előjel nélküli értéket helyi bájtsorrendből hálózati bájtsorrendbe konvertálja;
  • uint32_t ntohl(uint32_t netlong); - 32 bites előjel nélküli értéket alakít át hálózati bájtsorrendből helyi bájtsorrendbe;
  • uint16_t ntohs(uint16_t netshort); — a 16 bites előjel nélküli értéket hálózati bájtsorrendből helyi bájtsorrendbe konvertálja.

Ha az aktuális bájtsorrend és a hálózati függvény megegyezik, akkor „üresként” fognak működni, vagyis a bájtsorrend nem változik. A szabvány lehetővé teszi ezen függvények makróként való megvalósítását is.

Számos nyelven és könyvtárban lehetőség van mindkét fő bájtsorrendre való konvertálásra.

Linux kernel : , le16_to_cpu(), cpu_to_be32(), cpu_to_le16p()és így tovább;

FreeBSD kernel : htobe16(), le32toh(), és így tovább;

Erlang :

<< Szám : 32 / big - unsigned - integer , Átlag : 64 / big - float >> = Részlet Üzenet = << Hossz : 32 / kis - előjel nélküli - egész szám , MTípus : 16 / kis - előjel nélküli - egész szám , MessageBody >>

Python :

import struct Szám , Átlag = struct . kicsomagolás ( ">Ld" , Csomó ) Üzenet = struct . pack ( "<LH" , Length , MType ) + MessageBody

Perl :

( $Count , $Average ) = kicsomagolás ( 'L>d>' , $Chunk ); $Üzenet = csomag ( '(LS)<' , $Length , $MType ) . $MessageBody ; ( vagy ugyanaz : $Message = csomag ( 'Vv' , $Length , $MType ) . $ MessageBody ;)

ezek az Erlang, Python, Perl példák azonos funkcionalitást tartalmaznak.

Az Intel x86-64 processzorok BSWAP utasítással rendelkeznek a bájtsorrend megváltoztatásához.

A név etimológiája

A big-endian és little-endian kifejezések eredetileg nem vonatkoztak a számítástechnikára. A Gulliver utazásai , Jonathan Swift szatirikus alkotása Lilliputia és Blefuscu kitalált államait írja le, amelyek hosszú évek óta háborúznak egymással, mert nézeteltérésük támadt arról, hogy melyik végről törjék a főtt tojást . Azokat, akik azt hiszik, hogy a tompa végről le kell törni őket, a műben big-endiansoknak („tompa végeknek”) nevezik.

A számítástechnika nagy- és kis-végi támogatói közötti viták is gyakran az ún. „vallásháborúk”. [2] A big-endian és little - endian kifejezéseket Danny Cohen használta 1980-ban On Holy Wars and a Plea for Peace című cikkében .  [3] [4]

Lásd még

Jegyzetek

  1. pack() Perlben . Letöltve: 2010. december 20. Az eredetiből archiválva : 2010. december 13..
  2. A DAV Endian GYIK (lefelé irányuló kapcsolat) . Letöltve: 2008. augusztus 3. Az eredetiből archiválva : 2006. november 10. 
  3. Danny Cohen. On Holy Wars and a Plea for Peace  (angolul) (1980. április 1.). Hozzáférés dátuma: 2010. január 24. Az eredetiből archiválva : 2012. február 15.
  4. Tanenbaum E. Számítógép-architektúra. - 5. kiadás - Szentpétervár. : Péter, 2007. - 844 p. - S. 89.

Linkek