Bájtsorrend (endian), dsp, programozás

Megjegyzés: ARM processzor lehet bármilyen építészet nagy endian, vagy little endian, attól függően, hogy milyen chip, de leggyakrabban a big endian. PowerPC architektúra lehet beállítani, hogy működhet big endian módban, vagy little endian, de a Linux csak használják big endian.

[Miért aggódom végződést]

Mint már említettük, a sorrendben byte alacsony szinten a rendszer teljesen átlátható a programozó (kb végződést gyakran elfelejti). Azonban előfordulhat, hogy egy probléma, amikor az adatok cseréje egy másik rendszerben, mivel a másik rendszer lehet számítani, hogy az adatokat egy tároló egység az ellenkező sorrendben.

Például, ha nem lehet megjósolni előre, hogy milyen típusú rendszer néhány túlsó végén a hálózati kapcsolat, a hálózati protokollok kell használni előre meghatározni a sorrendben byte tárolására használt több bájtértékeket csomagfejlécekben. Ebben az esetben a byte-sorrend az úgynevezett hálózati byte sorrendben (hálózati byte sorrendben), és a TCP / IP, akkor big endian. Így a rendszer átalakítja származó csomagokat a helyi adattároló érdekében bájt a hálózatban. Ezt követően, a fogadó rendszerben átalakítja az adatokat a hálózati byte sorrendben egy helyi. A gyakorlatban, ha vannak szigorú követelményeknek megfelelő sebességet, és köztudott, hogy a helyi bájtsorrend ugyanaz, mint a hálózati, az átváltási művelet eldobjuk optimalizálása érdekében.

Egy másik jó példa - USB protokollt. amelyben a bájtsorrend bájtos mennyiségek little endian.

[Hogyan algoritmikusan meghatározzák a végződést]

Írhatsz egy egyszerű program, amely meghatározza a sorrendben byte a rendszerben.

Lines 1..4 meghatározza foo változó, amely elérhető akár a száma int típusú (int típus szinte mindig áll a több byte), vagy egy sor karakter karakter. A 6. sorban, a változót inicializálunk egész szám értéke 1, úgy, hogy legalább egy bájtot a több byte-száma egyenlő lesz 1 (a legkevésbé fontos bájt), és az összes többi értékű byte nullák lesznek. Ha byte 0 legkevésbé jelentős tömb, akkor 1-gyel egyenlő, ami azt jelenti, hogy a little endian rendszer. Ha byte 0 legjelentősebb byte tömböt, akkor nulla, és ez azt jelenti, big endian rendszer.

Kernel meghatározza a különböző típusú változók és makrók feldolgozására az értékek, amelyek függnek a byte-sorrend, ami eltér a jelenlegi rendszer által használt processzor.

A következő azonosítókat típusának megfelelő U16. U32 és u64. kivéve ha olyan definiált bit (bitenkénti) attribútum hogy használják, hogy korlátozzák azokat használni egész számok. Bitenkénti-attribútum segédprogram használ gyér, annak biztosítása érdekében, hogy a változó konvertálja a helyi processzor típusa elvégzése előtt más, mint egy változó (nem biztonságos, nem biztonságos) működését.

Az alábbi típusú lehet használni endian függő változók összekapcsolása után linux / kernel.h header-fájlt.

[Makrók transzformációk]

Van több makrók átalakítani a byte-sorrend által használt aktuális processzor érdekében akár nagy, vagy little endian. Továbbá, minden típusú átalakítás külön makrók 16-, 32- és 64-bites értékeket. makró nevét kódolják a forrás és a cél byte rendelési érték, így a nevek azonnal világos, hogy mi minden makró csinál.

Annak érdekében, hogy írjon hordozható kódot, akkor mindig használja ezeket a makrókat lehet átalakítani egy cél bájtsorrendjét a másikra, akkor is, ha előre tudják, hogy nem szükséges a processzor, ami jelenleg használ. Ha a forrás és a cél bájtsorrendjét ugyanaz a makró nem tesz semmit, hogy a makrók használatát nem befolyásolja a teljesítményt.

A következő makrókat értékkel tér vissza átalakítás után. Figyeljük meg, hogy a fejléc linux / kernel.h fájl fejlécében, hogy kell csatlakoztatni a Forráskódfájlok ahol makrókat használnak, de nem ez a header fájlban makrók definiálva.

A következő makrókat ugyanazok, mint az előzőek, az egyetlen különbség az, hogy a paraméter makro - egy pointert az átalakított értékeket. Felhívjuk figyelmét, hogy a nevek ilyen makrók ugyanaz, de hozzátette, az utótag „p” (a szó pointer) végén minden név.

A következő makrókat ugyanazt a dolgot, mint a korábbiak, de itt a helyét a kezdeti érték és az átváltott érték azonos. Felhívjuk figyelmét, hogy a nevek ilyen makrók ugyanaz, de hozzátette, az utótag „s” (a latin kifejezés in situ, azaz ugyanazon a helyen), a végén minden nevét.

A következő makrókat nyújtanak alias Imer, amelyek általánosan használt átalakítani a byte-sorrend a kódot a hálózati alkalmazások. Az első kettő felhasználni, hogy a makró egy helyi hálózati byte sorrendben. A másik két olyan fordított átalakulás. A betűk „s” és „L” a végén nevek ebben az esetben azt jelenti, a rövid (16-bites érték) és a hosszú (32-bites érték).

Mint már korábban említettük, a hálózati byte sorrendben mindig nagy endian, és ezek megvalósítását makrók biztosítja a helyes használata a byte-sorrend egy hálózati gép.

1. Byte Order site: bruceblinn.com.