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.
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 ( 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 .
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 .
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.
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.
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) |
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-endianFuttatási eredmények egy kis végű gépen ( x86 ):
$ uname -m i386 $ gcc -o testbyteorder testbyteorder.c $ ./testbyteorder kis-endianA 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.
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).
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()
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 ) + MessageBodyPerl :
( $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 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]