Endianness - Endianness

V práci na počítači , endianness je pořadí nebo posloupnost bajtů jednoho slova digitálních dat v paměti počítače . Endianness je primárně vyjádřen jako big-endian ( BE ) nebo small -endian ( LE ). Systém big-endian ukládá nejvýznamnější bajt slova na nejmenší adresu paměti a nejméně významný bajt na největší. Trochu endianový systém naopak ukládá nejméně významný bajt na nejmenší adresu.

Endianness může být také použit k popisu pořadí, ve kterém jsou bity vysílány přes komunikační kanál, např. Big-endian v komunikačním kanálu vysílá nejvýznamnější bity jako první. Bit-endianness se zřídka používá v jiných kontextech.

Počítače ukládají informace do skupin binárních bitů různých velikostí. Každé skupině je přiřazeno číslo, nazývané její adresa , které počítač používá k přístupu k těmto datům. Na většině moderních počítačů je nejmenší datová skupina s adresou dlouhá osm bitů a nazývá se bajt. Větší skupiny obsahují dva nebo více bajtů, například 32bitové slovo obsahuje čtyři bajty. Existují dva možné způsoby, jak by počítač mohl číslovat jednotlivé bajty ve větší skupině, počínaje na obou koncích. Oba typy endianness jsou široce používány v digitálním elektronickém inženýrství. Počáteční volba endianness nového designu je často libovolná, ale pozdější technologické revize a aktualizace zachovávají stávající endianness, aby byla zachována zpětná kompatibilita .

Interně bude každý daný počítač fungovat stejně dobře bez ohledu na to, jakou endianness používá, protože jeho hardware bude konzistentně používat stejnou endianness pro ukládání i načítání dat. Z tohoto důvodu programátoři a uživatelé počítačů obvykle ignorují endianness počítače, se kterým pracují. Endianness se však může stát problémem při přesunu dat externě do počítače - například při přenosu dat mezi různými počítači nebo programátorem, který zkoumá interní počítačové bajty dat z výpisu paměti - a použitá endianness se liší od očekávání. V těchto případech je nutné chápat a zohlednit endianitu údajů. Bi-endianness je funkce podporovaná řadou počítačových architektur, které obsahují přepínatelnou endianness při načítání a ukládání dat nebo pro načítání instrukcí.

Big-endianness je dominantní uspořádání v síťových protokolech, například v sadě internetových protokolů , kde se označuje jako pořadí v síti , přičemž se nejprve přenáší nejvýznamnější bajt. Naopak malá endianita je dominantním uspořádáním procesorových architektur ( x86 , většina implementací ARM , základní implementace RISC-V ) a jejich přidružené paměti. Formáty souborů mohou využívat buď řazení; některé formáty používají kombinaci obou nebo obsahují indikátor, jehož uspořádání je použito v celém souboru.

Styly small- a big-endian mohou být také použity obecněji k charakterizaci uspořádání libovolné reprezentace, např. Číslic v číselné soustavě nebo částí data . Čísla v pozičním zápisu jsou obvykle psána s číslicemi v big-endianovém pořadí, dokonce i ve skriptech zprava doleva . Podobně programovací jazyky používají pro číselné literály řazení velkých číslic .

Příklad

Endian příklad
Big-endian
Malý Endian

Tyto dva diagramy ukazují, jak dva počítače využívající různé endianity ukládají 32bitové (čtyřbajtové) celé číslo s hodnotou 0x0A0B0C0D . V obou případech je celé číslo rozděleno na čtyři bajty, 0x0A , 0x0B , 0x0C a 0x0D a bajty jsou uloženy ve čtyřech sekvenčních bajtech v paměti, počínaje místem v paměti s adresou a , poté a + 1 , a + 2 a + 3 . Rozdíl mezi velkým a malým endianem je pořadí čtyř bajtů ukládaného celého čísla.

Levý diagram ukazuje počítač využívající big-endian. Tím začíná ukládání celého čísla s nejvýznamnějším bajtem 0x0A na adresu a a končí s nejméně významným bajtem 0x0D na adrese a + 3 .

Na diagramu na pravé straně je zobrazen počítač využívající little-endian. Tím začíná ukládání celého čísla s nejméně významným bytem, 0x0D , na adresu a , a končí nejvýznamnějším bytem, 0x0A , na adrese a + 3 .

Protože každý počítač používá k uložení i načtení celého čísla stejnou endianness, budou výsledky pro oba počítače stejné. Problémy mohou nastat, když je paměť adresována bajty místo celých čísel, nebo když je obsah paměti přenášen mezi počítači s různou endianitou.

Etymologie

Danny Cohen představil požadavky big-endian a little-endian do výpočetní techniky pro datovou uspořádání v Internet Experiment poznámce publikoval v roce 1980.

Přívlastek endian má svůj původ ve spisech anglo-irského spisovatele 18. století Jonathana Swifta . V románu Gulliverovy cesty z roku 1726 zobrazuje konflikt mezi sektami liliputánů rozdělenými na sekty rozbíjející skořápku vařeného vejce z velkého konce nebo z malého konce. Říkal jim Big-endiáni a Little-endiáni . Cohen dělá spojení s Gulliverovými cestami výslovně v příloze jeho poznámky z roku 1980.

Základy

Počítačová paměť se skládá ze sekvence paměťových buněk (nejmenších adresovatelných jednotek), nejčastěji se jim říká bajty . Každý bajt je identifikován a je k němu v hardwaru a softwaru přístup podle jeho adresy v paměti . Pokud je celkový počet bajtů v paměti n , pak jsou adresy vyčísleny od 0 do n  - 1.

Počítačové programy často používají datové struktury nebo pole, která mohou obsahovat více dat, než kolik lze uložit do jednoho bajtu. V souvislosti s tímto článkem, pokud její typ nelze libovolně komplikované, je „pole“ se skládá z po sobě jdoucích sekvence bytů a představuje „jednoduchou datovou hodnotu“, která - alespoň potenciálně - lze manipulovat jednou jedinou instrukci hardwaru . Adresa takového pole je většinou adresa jeho prvního bajtu.

Dalším důležitým atributem toho, že bajt je součástí „pole“, je jeho „význam“. Tyto atributy částí pole hrají důležitou roli v posloupnosti, ke které k bytům přistupuje počítačový hardware, přesněji: pomocí algoritmů nízké úrovně přispívajících k výsledkům počítačové instrukce.

Čísla

Poziční číselné systémy (většinou základna 10, základna 2 nebo základna 256 v případě 8bitových bytů) jsou převládajícím způsobem reprezentace a zejména manipulace s celočíselnými daty pomocí počítačů. V čisté podobě je platný pro středně velké non-záporná celá čísla, například v C datový typ unsigned. V takovém číselném systému je hodnota číslice, kterou přispívá k celému číslu, určena nejen její hodnotou jako jediné číslice, ale také pozicí, kterou zaujímá v úplném čísle, nazývanou její význam. Tyto pozice lze mapovat do paměti hlavně dvěma způsoby:

  • klesající číselná významnost se zvyšujícími se adresami paměti (nebo rostoucím časem), známým jako big-endian a
  • rostoucí numerický význam se zvyšujícími se adresami paměti (nebo rostoucím časem), známý jako malý endian .

Celočíselná data, která jsou přímo podporována hardwarem počítače, mají pevnou šířku nízkého výkonu 2, např. 8 bitů ≙ 1 bajt, 16 bitů ≙ 2 bajty, 32 bitů ≙ 4 bajty, 64 bitů ≙ 8 bytů, 128 bitů ≙ 16 bajtů. Sekvence přístupu na nízké úrovni k bajtům takového pole závisí na operaci, která má být provedena. K nejméně významnému bajtu se přistupuje jako první pro sčítání , odčítání a násobení . K nejvýznamnějšímu bajtu se přistupuje jako první k dělení a porovnávání . Viz § Pořadí výpočtu .

Pro plovoucí desetinnou čárkou čísla, viz § s plovoucí desetinnou čárkou .

Text

Pokud mají být znakové (textové) řetězce navzájem porovnávány, např. Za účelem podpory nějakého mechanismu, jako je třídění , je to velmi často prováděno lexikograficky, kde má jeden poziční prvek (znak) také poziční hodnotu. Lexikografické srovnání znamená téměř všude: první postava je nahoře - jako v telefonním seznamu.

Celočíselná čísla zapsaná jako text jsou vždy reprezentována nejvýznamnější číslicí nejprve v paměti, která je podobná big-endian, nezávisle na směru textu .

Hardware

Dějiny

Mnoho historických a existujících procesorů používá reprezentaci paměti typu big-endian, a to buď výhradně, nebo jako možnost návrhu. Jiné typy procesorů používají reprezentaci paměti typu endian; jiní používají ještě další schéma zvané middle-endian , mixed-endian nebo PDP-11 -endian .

IBM System / 360 používá big-endian bajt pořadí, stejně jako jeho nástupci System / 370 , ESA / 390 , a z / Architecture . Na PDP-10 používá big-endian adresování instrukcí byte-orientovaný. IBM Series / 1 minipočítač využívá velký-endian pořadí bajtů.

Nakládání s daty různé endianness se někdy nazývá problém NUXI . Tato terminologie se zmiňuje o konfliktech pořadí bajtů , k nimž došlo při přizpůsobování systému UNIX , který běžel na PDP-11 se smíšeným endianem, na počítač big-endian IBM Series/1. Unix byl jedním z prvních systémů, které umožnily kompilaci stejného kódu pro platformy s různými interními reprezentacemi. Jeden z prvních převedených programů se měl vytisknout Unix, ale na Series/1 se nUximísto toho vytiskl .

Datapoint 2200 používá jednoduchý bit-sériový logika s malým-endian s cílem usnadnit šíření carry . Když Intel vyvinul mikroprocesor 8008 pro Datapoint, pro kompatibilitu použili small-endian. Protože však Intel nebyl schopen dodat 8008 včas, Datapoint použil ekvivalent integrace ve středním měřítku , ale malá endianness byla zachována ve většině návrhů Intel, včetně MCS-48 a 8086 a jeho x86 nástupců. Prosince Alpha , Atmel AVR , VAX je MOS Technology 6502 rodina (včetně Western Design Center 65802 a 65C816 ), Zilog Z80 (včetně Z180 a eZ80 ), o Altera Nios II , a mnoho dalších zpracovatelů a rodiny procesorů jsou také Little- endian.

Procesory Motorola 6800 /6801, 6809 a 68000 používaly formát big-endian.

Intel 8051 , na rozdíl od ostatních procesorů Intel, očekává 16bitové adresy pro LJMP a LCALL ve formátu big-endian; instrukce xCALL však ukládají zpáteční adresu do zásobníku ve formátu little-endian.

SPARC historicky používalo big-endian až do verze 9, která je bi-endian ; podobně rané procesory IBM POWER byly big-endian, ale potomci PowerPC a Power ISA jsou nyní bi-endian. Architektura ARM byla před verzí 3 málo endianová, když se stala bi-endianovou.

Současné architektury

Procesory řady Intel x86 a AMD64 / x86-64 používají formát small-endian. Mezi další architektury instrukčních sad, které dodržují tuto konvenci a umožňují pouze režim s malým endianem, patří Nios II , Andes Technology NDS32 a Qualcomm Hexagon .

Některé architektury instrukčních sad umožňují spouštění softwaru obou endianness na bi-endian architektuře. To zahrnuje ARM AArch64 , C-Sky , Power ISA a RISC-V .

Mezi architektury pouze velkých endianů patří IBM z/Architecture , Freescale ColdFire (na bázi řady Motorola 68000 ), Atmel AVR32 a OpenRISC . IBM AIX a Oracle Solaris operační systémy na bi-endian Power ISA a SPARC spustit v režimu big-endian; některé distribuce Linuxu na Power se přesunuly do režimu little-endian.

Bi-endianness

Některé architektury (včetně ARM verze 3 a výše, PowerPC , Alpha , SPARC V9, MIPS , PA-RISC , SuperH SH-4 a IA-64 ) obsahují nastavení, které umožňuje přepínatelnou endianness při načítání a ukládání dat, načítání instrukcí nebo oba. Tato funkce může zlepšit výkon nebo zjednodušit logiku síťových zařízení a softwaru. Slovo bi-endian , když je uvedeno o hardwaru, označuje schopnost stroje vypočítat nebo předat data v libovolném endianovém formátu.

Mnoho z těchto architektur lze pomocí softwaru přepnout na výchozí do konkrétního formátu endian (obvykle se provádí při spuštění počítače); v některých systémech je však výchozí endianita vybrána hardwarem na základní desce a nelze ji změnit pomocí softwaru (např. Alpha, která na Cray T3E běží pouze v režimu big-endian ).

Všimněte si toho, že termín bi-endian se týká především toho, jak zpracovatel zpracovává přístup k datům. Přístupy k instrukcím (načtení instrukčních slov) na daném procesoru mohou stále předpokládat pevnou endianness, i když jsou datové přístupy plně bi-endianové, i když tomu tak není vždy, například na procesoru Intel Itanium s procesorem IA-64 , který umožňuje obojí.

Všimněte si také, že některé nominálně bi-endian procesory vyžadují pomoc základní desky k úplnému přepnutí endianness. Například 32bitové procesory PowerPC orientované na stolní počítače v režimu Little-Endian fungují jako Little-Endian z pohledu provádějících programů, ale vyžadují, aby základní deska provedla 64bitový swap napříč všemi 8 bajtovými pruhy zajistěte, aby se na I/O zařízení vztahoval trochu endianový pohled na věc . Při absenci tohoto neobvyklého hardwaru základní desky musí software ovladače zařízení zapisovat na různé adresy, aby zrušil neúplnou transformaci, a také musí provést normální výměnu bajtů.

Některé CPU, například mnoho procesorů PowerPC určených pro vestavěné použití a téměř všechny procesory SPARC, umožňují výběr endianness na stránce.

Procesory SPARC od konce devadesátých let (procesory kompatibilní se standardem SPARC v9) umožňují zvolit endianness dat s každou jednotlivou instrukcí, která se načítá nebo ukládá do paměti.

Architektura ARM podporuje dva režimy big-endian, nazývané BE-8 a BE-32 . CPU až ARMv5 podporují pouze režim BE-32 nebo režim invariantní pro slova. Zde jakýkoli přirozeně zarovnaný 32bitový přístup funguje jako v režimu little-endian, ale přístup k bajtu nebo 16bitovému slovu je přesměrován na odpovídající adresu a přístup bez zarovnání není povolen. ARMv6 zavádí režim BE-8 nebo byte invariantní, kde přístup k jednomu bajtu funguje jako v režimu little-endian, ale přístup k 16bitovému, 32bitovému nebo (počínaje ARMv8) 64bitovému slovu má za následek výměnu bajtů dat. To zjednodušuje nezarovnaný přístup k paměti a také přístup mapovaný do paměti k registrům jiným než 32 bitů.

Mnoho procesorů má pokyny k převodu slova v registru na opačnou endianness, to znamená, že prohodí pořadí bytů v 16-, 32- nebo 64bitovém slově. Všechny jednotlivé bity však nejsou obráceny.

Nedávné procesory architektury Intel x86 a x86-64 mají instrukci MOVBE ( Intel Core od generace 4, po Atomu ), která načte z paměti slovo formátu big-endian nebo zapíše slovo do paměti ve formátu big-endian. Tyto procesory jsou jinak důkladně málo endianové. Také již měli řadu swapových instrukcí pro obrácení pořadí bytů obsahu registrů, například když již byla načtena slova z paměťových míst, kde byly ve 'špatné' endianness.

Plovoucí bod

Ačkoli dnešní všudypřítomné procesory x86 využívají úložiště typu low-endian pro všechny typy dat (celé číslo, plovoucí desetinná čárka), existuje řada hardwarových architektur, kde jsou čísla s plovoucí desetinnou čárkou zastoupena v podobě typu big-endian, zatímco celá čísla jsou zastoupena v malém- endianská forma. Existují procesory ARM, které mají poloviční reprezentaci s plovoucí desetinnou čárkou s polovičním koncem, polovinu s velkým endiánem: obě 32bitová slova jsou uložena v malých endianech jako celočíselné registry, ale nejdřív to nejdůležitější. Protože existuje mnoho formátů s plovoucí desetinnou čárkou, které pro ně nemají žádné „ síťové “ standardní zastoupení, používá standard XDR jako reprezentaci big-endian IEEE 754. Může se proto zdát divné, že rozšířený standard IEEE 754 s plovoucí desetinnou čárkou neurčuje endianness. Teoreticky to znamená, že ani standardní IEEE data s plovoucí desetinnou čárkou zapsaná jedním počítačem nemusí být čitelná na jiném. Na moderních standardních počítačích (tj. Implementujících IEEE 754) však lze v praxi bezpečně předpokládat, že endianness je pro čísla s plovoucí desetinnou čárkou stejný jako pro celá čísla, takže převod je přímočarý bez ohledu na datový typ. (Malé vestavěné systémy používající speciální formáty s plovoucí desetinnou čárkou však mohou být jiná věc.)

VAX s plovoucí desetinnou čárkou ukládá 16bitová slova s ​​malým endianem v pořadí big-endian.

Data s proměnnou délkou

Většina dosud uvažovaných instrukcí obsahuje velikost (délky) jejích operandů v rámci operačního kódu . Často dostupné délky operandů jsou 1, 2, 4, 8 nebo 16 bajtů. Existují však také architektury, kde délka operandu může být držena v samostatném poli instrukce nebo se samotným operandem, např. Pomocí slovní značky . Takový přístup umožňuje délky operandů až 256 bajtů nebo dokonce plnou velikost paměti. Datové typy takových operandů jsou znakové řetězce nebo BCD .

Stroje schopné manipulovat s takovými daty jednou instrukcí (např. Porovnávat, přidávat) jsou např. IBM 1401 , 1410 , 1620 , System/3x0 , ESA/390 a z/Architecture , všechny typu big-endian.

Optimalizace

Systém Little-endian má tu vlastnost, že stejnou hodnotu lze číst z paměti na různých délkách bez použití různých adres (i když jsou uložena omezení zarovnání ). Například umístění 32bitové paměti s obsahem 4A 00 00 00lze číst na stejné adrese jako 8bitové (hodnota = 4A), 16bitové (004A), 24bitové (00004A) nebo 32bitové (0000004A) , které si všechny zachovávají stejnou číselnou hodnotu. Ačkoli tuto vlastnost málo endianů zřídka používají přímo programátoři na vysoké úrovni, často ji používají optimalizátoři kódu i programátoři jazyka sestavení .

V konkrétnějších termínech jsou takové optimalizace ekvivalentem následujícího kódu C, který vrací true na většině systémů s malým endianem:

union {
  uint8_t u8; uint16_t u16; uint32_t u32; uint64_t u64;
} u = { .u64 = 0x4A };
puts(u.u8 == u.u16 && u.u8 == u.u32 && u.u8 == u.u64 ? "true" : "false");

I když to C ++ nepovoluje, takový typ kódování je povolen jako "implementace definována" standardem C11 a běžně se používá v kódu interagujícím s hardwarem.

Na druhou stranu v některých situacích může být užitečné získat aproximaci vícebajtové nebo víceslovné hodnoty čtením pouze její nejvýznamnější části namísto úplné reprezentace; big-endian procesor může číst takovou aproximaci pomocí stejné základní adresy, která by byla použita pro plnou hodnotu.

Optimalizace tohoto druhu nejsou přenosné napříč systémy různé endianness.

Pořadí výpočtu

Některé operace v pozičních číselných systémech mají přirozené nebo upřednostňované pořadí, ve kterém mají být provedeny základní kroky. Tato objednávka může ovlivnit jejich výkon na malých bajtově adresovatelných procesorech a mikrokontrolérech . Vysoce výkonné procesory však obvykle načítají typické vícebajtové operandy z paměti za stejnou dobu, za kterou by byly načteny jeden bajt, takže složitost hardwaru není ovlivněna uspořádáním bajtů.

Sčítání, odčítání a násobení začíná na nejméně významné číselné pozici a šíří přenos do následující významnější polohy. Adresování víceciferných dat na jeho prvním (= nejmenší adresa) bajtu je převládající schéma adresování. Když tento první bajt obsahuje nejméně významnou číslici -což je ekvivalentní malé tečkovitosti, pak je implementace těchto operací okrajově jednodušší.

Porovnání a dělení začíná na nejvýznamnější číslici a šíří možný přenos na následující méně významné číslice. U číselných hodnot s pevnou délkou (typicky s délkou 1,2,4,8,16) je implementace těchto operací na big-endianových strojích okrajově jednodušší.

Mnoho big-endianových procesorů (např. IBM System/360 a jeho nástupci) obsahuje hardwarové instrukce pro lexikografické porovnávání řetězců znaků různé délky.

Normální přenos dat příkazem o přiřazení je v zásadě nezávislý na endianness procesoru.

Middle-endian

Je možná řada dalších uspořádání, obecně nazývaných mid-endian nebo mixed-endian . Jedním z takových příkladů mimo počítačovou vědu je standardní americké formátování data měsíc/den/rok.

PDP-endian

PDP-11 je v zásadě 16bitové málo endian systému. Pokyny pro převod mezi hodnotami s plovoucí desetinnou čárkou a celočíselnými hodnotami ve volitelném procesoru s plovoucí desetinnou čárkou PDP-11/45, PDP-11/70 a v některých novějších procesorech ukládaly 32bitové hodnoty „dvojitá přesnost celé číslo dlouhé“ s 16bitové poloviny se vyměnily z očekávaného řádu malých endianů. UNIX C kompilátor používá stejný formát pro 32bitové dlouhé celých čísel. Toto řazení je známé jako PDP-endian .

Způsob, jak tuto endiannost interpretovat, je, že ukládá 32bitové celé číslo jako dvě 16bitová slova v big-endianu, ale samotná slova jsou málo endianová (např. „Jag cog sin“ by bylo „gaj goc nis“):

Uložení 32bitového celého čísla 0x0A0B0C0D na PDP-11
zvyšování adres   →
... 0B h 0A h 0 h 0C h ...
... 0A0B h 0C0D h ...

16bitové hodnoty zde odkazují na jejich číselné hodnoty, nikoli na jejich skutečné rozložení.

Popisovače segmentů Intel IA-32

Segmentové deskriptory z IA-32 a kompatibilní procesory udržet 32bitové základní adresa segmentu uloženého v málo endian pořadí, ale ve čtyřech nejdou bytech, v relativních polohách 2, 3, 4 a 7 začátku deskriptoru.

Bajtové adresování

Když jsou paměťové bajty vytištěny postupně zleva doprava (např. V hexadecimálním výpisu ), má význam pro zleva doprava rostoucí zastoupení celých čísel na konci. Jinými slovy, při vizualizaci to vypadá pozpátku, což může být neintuitivní.

K tomuto chování dochází například ve FourCC nebo podobných technikách, které zahrnují sbalování znaků do celého čísla, takže se stane sekvencí konkrétních znaků v paměti. Pojďme definovat notaci 'John'jednoduše jako výsledek zápisu znaků v hexadecimálním ASCII a připojení 0xna přední stranu a analogicky pro kratší sekvence ( C multicharacter doslovný , ve stylu Unix/MacOS):

   '  J  o  h  n  '
hex  4A 6F 68 6E
----------------
   -> 0x4A6F686E

Na strojích s velkým endianem se hodnota zobrazuje zleva doprava a shoduje se se správným pořadím řetězců pro čtení výsledku:

zvyšování adres   →
... 4A h 6F h 68 h 6E h ...
... 'J' 'Ó' 'h' 'n' ...

Ale na malém endianském stroji by člověk viděl:

zvyšování adres   →
... 6E h 68 h 6F h 4A h ...
... 'n' 'h' 'Ó' 'J' ...

Middle-endianové stroje, jako je Honeywell 316 výše, to ještě komplikují: 32bitová hodnota je uložena jako dvě 16bitová slova „hn“ „Jo“ v malém endianu, sama s notou big-endian (tedy „h“ 'n' 'J' 'o' ).

Výměna bytů

Výměna bytů spočívá v maskování každého bajtu a jeho přesunutí na správné místo. Mnoho kompilátorů poskytuje vestavěné moduly, které je pravděpodobně možné zkompilovat do pokynů nativního procesoru ( bswap/ movbe), například __builtin_bswap32. Softwarová rozhraní pro výměnu zahrnují:

  • Standardní funkce endianness sítě (od/do BE, až 32bitové). Windows má 64bitové rozšíření winsock2.h.
  • endian.hFunkce BSD a Glibc (od/do BE a LE, až 64bitové).
  • OSByteOrder.hmakra macOS (od/do BE a LE, až 64bitová).

Soubory a souborové systémy

Rozpoznání endianness je důležité při čtení souboru nebo souborového systému, který byl vytvořen na počítači s jinou endianness.

Některé sady instrukcí CPU poskytují nativní podporu pro výměnu bajtů endian, například bswap( x86 - 486 a novější) a rev( ARMv6 a novější).

Některé kompilátory mají vestavěná zařízení pro výměnu bajtů. Kompilátor Intel Fortran například podporuje CONVERTpři otevírání souboru nestandardní specifikátor, např .: . OPEN(unit, CONVERT='BIG_ENDIAN',...)

Některé kompilátory mají možnosti generování kódu, které globálně umožňují převod pro všechny operace IO souboru. To umožňuje opětovné použití kódu v systému s opačnou endianitou bez úpravy kódu.

Sekvenční neformátované soubory Fortran vytvořené s jednou endianness obvykle nelze přečíst v systému pomocí druhé endianness, protože Fortran obvykle implementuje záznam (definovaný jako data zapsaná jedním příkazem Fortran) jako data, kterým předchází a následují pole počtu, která jsou celá čísla stejná na počet bajtů v datech. Pokus o přečtení takového souboru pomocí Fortranu v systému druhého endianness pak má za následek chybu run-time, protože pole count jsou nesprávná. Tomuto problému se lze vyhnout zapisováním sekvenčních binárních souborů na rozdíl od sekvenčních neformátovaných. Všimněte si však, že je poměrně jednoduché napsat program v jiném jazyce (například C nebo Python ), který analyzuje sekvenční neformátované soubory Fortran „cizí“ endianity Fortran a převádí je na „nativní“ endianness, a to převodem z „cizí“ endianness, když čtení Fortranových záznamů a dat.

Text Unicode může volitelně začínat znakem pořadí bajtů (BOM), který signalizuje endianitu souboru nebo streamu. Jeho kódový bod je U+FEFF. Například v UTF-32 by měl soubor big-endian začínat 00 00 FE FF; malý endian by měl začít FF FE 00 00.

Formáty binárních dat aplikací, jako jsou například soubory MATLAB .mat nebo datový formát .bil , používané v topografii, jsou obvykle nezávislé na endianness. Toho je dosaženo uložením dat vždy v jedné pevné endianness, nebo přenosem dat s datem označujícím endianness.

Příkladem prvního případu je binární formát souboru XLS, který je přenosný mezi systémy Windows a Mac a vždy je malý, takže aplikace Mac vyměňuje bajty při zatížení a ukládá je, když běží na velkém endianovém procesoru Motorola 68K nebo PowerPC .

Soubory obrázků TIFF jsou příkladem druhé strategie, jejíž záhlaví instruuje aplikaci o endianitě jejich interních binárních celých čísel. Pokud soubor začíná podpisem MM, znamená to, že celá čísla jsou reprezentována jako big-endian, zatímco IIznamená small -endian. Tyto podpisy potřebují každé jedno 16bitové slovo a jsou to palindromy (to znamená, že čtou stejně dopředu i dozadu), takže jsou nezávislé na endianness. Iznamená Intel a Mznamená Motorola , příslušní poskytovatelé CPU na platformách IBM PC kompatibilních (Intel) a Apple Macintosh (Motorola) v 80. letech minulého století. Procesory Intel jsou málo endianové, zatímco procesory Motorola 680x0 jsou velké. Tento explicitní podpis umožňuje programu pro čtení TIFF v případě potřeby vyměnit bajty, když byl daný soubor vygenerován programem pro zápis TIFF spuštěným na počítači s jinou endianness.

V důsledku své původní implementace na platformě Intel 8080 je souborový systém FAT ( File Allocation Table ) nezávislý na operačním systému definován s bajtovým uspořádáním typu endian, a to i na platformách, které nativně používají jiné endianny, což vyžaduje operace výměny bajtů pro udržování tuk.

Je známo, že kombinovaný systém souborů ZFS / OpenZFS a správce logických svazků poskytují adaptivní endianness a fungují se systémy big-endian i small-endian.

Sítě

Mnoho IETF RFC používá termín síťové pořadí , což znamená pořadí přenosu bitů a bytů po drátu v síťových protokolech . Historický RFC 1700 (také známý jako internetový standard STD 2) mimo jiné definoval pořadí sítí pro protokoly v sadě internetových protokolů jako big-endian , a proto se pro big-endian byte používá termín „pořadí bajtů sítě“ objednat.

Ne všechny protokoly však používají jako pořadí sítě bajtové pořadí big-endian. Protokol SMB ( Server Message Block ) používá pořadí bajtů malých konců. V CANopen jsou vícebajtové parametry vždy odesílány jako nejméně významný bajt (little-endian). Totéž platí pro ethernetový Powerlink .

Rozhraní Berkeley sockets API definuje sadu funkcí pro převod 16bitových a 32bitových celých čísel do az pořadí bajtů sítě: funkce htons(host-to-network-short) a htonl(host-to-network-long) převádějí 16- bitové a 32bitové hodnoty od počítače ( hostitele ) po pořadí v síti; ntohsa ntohlfunkce převést ze sítě do hostitelské pořadí. Tyto funkce mohou být no-op na big-endian systému.

Zatímco síťové protokoly na vysoké úrovni obvykle považují bajt (většinou míněný jako oktet ) za svou atomovou jednotku, nejnižší síťové protokoly se mohou zabývat uspořádáním bitů v bajtu.

Bit endianness

Bitové číslování je koncept podobný endianness, ale na úrovni bitů, nikoli bajtů. Bitová endianita nebo endianita bitové úrovně označuje pořadí přenosu bitů přes sériové médium. Analog bitové úrovně bit-endian (nejméně významný bit jde jako první) se používá v RS-232 , HDLC , Ethernet a USB . Některé protokoly používají opačné řazení (např. Teletext , I 2 C , SMBus , PMBus a SONET a SDH ) a ARINC 429 používá jedno řazení pro pole s popiskem a druhé pro zbývající část rámce. Obvykle existuje konzistentní pohled na bity bez ohledu na jejich pořadí v bajtu, takže tento se stane relevantní pouze na velmi nízké úrovni. Jedna výjimka je způsobena funkcí některých cyklických kontrol redundance, které detekují všechny chyby shluku až do známé délky, což by bylo zkažené, pokud se pořadí bitů liší od pořadí bajtů při sériovém přenosu.

Kromě serializace se termíny bitová endianita a endianness bitové úrovně používají jen zřídka, protože počítačové architektury, kde každý jednotlivý bit má jedinečnou adresu, jsou vzácné. K jednotlivým bitům nebo bitovým polím se přistupuje prostřednictvím jejich číselné hodnoty nebo v programovacích jazycích na vysoké úrovni přiřazeným jménům, jejichž efekty však mohou být závislé na stroji nebo postrádat přenositelnost softwaru .

Poznámky

Reference

Citace

Další čtení

externí odkazy