Pořadí bajtů

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 13. listopadu 2018; kontroly vyžadují 39 úprav .

V moderních počítačových a digitálních komunikačních systémech jsou informace obvykle reprezentovány jako sekvence bajtů . V případě, že číslo nelze reprezentovat jedním bajtem, je důležité, v jakém pořadí jsou bajty zapisovány do paměti počítače nebo přenášeny po komunikačních linkách. Volba pořadí bajtů je často libovolná a je určena pouze konvencemi.

Obecně platí, že pro reprezentaci čísla M většího než 255 (zde  - maximální celé číslo, které lze zapsat do jednoho bytu ), musíte použít několik bytů (n). V tomto případě je číslo M zapsáno v poziční číselné soustavě v základu 256:

Sada celých čísel , každé mezi 0 a 255, je posloupnost bajtů, které tvoří M . V tomto případě se nazývá nízký bajt a  - vysoký bajt čísla M.

Vzhledem k tomu, že počítač neadresuje jednotlivé bity (lze je získat pouze prostřednictvím bitových polí ), je pořadí bitů v byte důležité pouze ve fyzické organizaci ukládání a přenosu dat, může se lišit zařízení od zařízení a obvykle není potřebuje aplikační programátor.

Možnosti nahrávání

Pořadí od nejstaršího po nejmladší

Pořadí od nejstaršího po nejmladšího ( anglicky  big-endian  - od velkého konce): . Toto pořadí je podobné obvyklému pořadí psaní (např . v arabských číslicích ) „zleva doprava“, například číslo sto dvacet tři by se psalo v takovém pořadí jako 123 . Ve stejném pořadí je obvyklé zapisovat bajty v technické a naučné literatuře, pokud není výslovně uvedeno jiné pořadí.

Toto pořadí je standardní pro protokoly TCP/IP , používá se v hlavičkách datových paketů a v mnoha protokolech vyšší úrovně navržených pro použití přes TCP/IP. Proto se pořadí bajtů od vysoké po nízkou často nazývá "síťové pořadí bajtů" ( anglicky  network byte order ). Toto pořadí bajtů používají procesory IBM 360 / 370/390, SPARC , Motorola 68000 (odtud třetí název - Motorola byte order , angl.  Motorola byte order ).

S tímto pořadím bajtů je vhodné porovnávat řetězce (můžete je porovnávat s celočíselnými poli-části větší kapacity, z nichž každý obsahuje několik znaků najednou).

Pořadí bajtů od vysoké po nízkou se také používá v mnoha formátech souborů  – například PNG , FLV , EBML , JPEG .

Pořadí od nejmladšího po nejstaršího

Pořadí od nejmladšího po nejstaršího ( angl.  little-endian  - od malého konce):

Toto je obrácené pořadí běžného zápisu čísel arabskými číslicemi , například číslo sto dvacet tři by bylo zapsáno v takovém pořadí jako 321 . Jinými slovy, toto pořadí je podobné pravidlu psaní zprava doleva.

Toto pořadí zápisu je přijato v paměti osobních počítačů s procesory architektury x86 , a proto se někdy nazývá Intel byte order (podle názvu společnosti, která architekturu x86 vytvořila). Moderní x86 procesory umožňují pracovat s jedno-, dvou-, čtyř- a osmibajtovými operandy. V tomto pořadí bajtů je velmi výhodné, když se zvětší velikost (počet bajtů) operandu, hodnota jeho prvního bajtu zůstane nezměněna: 3210 → 3210'0000. V pořadí z vysoké na nízkou by se hodnota změnila, například: 0123 → 0000'0123;

Kromě x86 se toto pořadí bajtů používá v architekturách VAX (odtud jiný název pro angličtinu.  VAX byte order [1] ), DEC Alpha a mnoha dalších.

Také pořadí „od nejnižší k nejvyšší“ se používá v tabulce oddílů USB , PCI , GUID , doporučuje jej FidoNet . Obecně však konvence little-endian podporuje méně meziplatformních protokolů a datových formátů než big-endian .

Přepínatelné pořadí

Mnoho procesorů může pracovat v nižším až vysokém řádu a naopak, jako je ARM (výchozí nastavení je little endian), PowerPC (kromě PowerPC 970 ), DEC Alpha , MIPS , PA-RISC a IA-64 . Pořadí bajtů se obvykle volí softwarem při inicializaci operačního systému , ale lze jej zvolit i hardwarovými propojkami na základní desce. V tomto případě je správnější mluvit o endianness na úrovni operačního systému. Přepínatelný endianness se někdy nazývá engl.  bi-endian .

Smíšené pořadí

Smíšené (kombinované, hybridní) pořadí bajtů ( anglicky  middle-endian) se někdy používá při práci s čísly, jejichž délka přesahuje strojové slovo . Číslo je reprezentováno posloupností strojových slov , která jsou zapsána ve formátu, který je pro tuto architekturu přirozený, ale samotná strojová slova následují v obráceném pořadí.

Procesory VAX a ARM používají smíšenou reprezentaci pro dlouhá reálná čísla.

Příklad

Následuje příklad, který popisuje umístění 4bajtového čísla do paměti RAM počítače, ke kterému lze přistupovat jako k 32bitovému slovu i bajtu po bajtu.

Všechna čísla jsou zapsána v šestnáctkové soustavě.

Číslo: 0xA1B2C3D4
Výkon
Pořadí od nejmladšího po nejstaršího (malý Endian)
Pořadí od nejstaršího po nejmladší (big-endian)
Rozkaz přijatý v PDP-11 (PDP-endian)

Určení endianness

Pořadí bajtů (endianness) v konkrétním stroji lze určit pomocí programu C (testbyteorder.c):

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

Výsledky běhu na stroji big-endian ( SPARC ):

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

Spusťte výsledky na počítači little-endian ( x86 ):

$ uname -m i386 $ gcc -o testbyteorder testbyteorder.c $ ./testbyteorder malý Endian

Reálná čísla

Ukládání reálných čísel může také záviset na endianness. Například na x86 se používají formáty IEEE 754 se znaménkem a exponentem ve vysokých bajtech.

Unicode

Pokud je Unicode napsáno ve formátu UTF-16 nebo UTF-32 , pak je endianness již významný. Jedním ze způsobů, jak uvést pořadí bajtů v textech Unicode, je předpona speciálního znaku BOM ( značka pořadí bajtů , značka pořadí bajtů , U+FEFF) - "invertovaná" verze tohoto znaku (U+FFFE) neexistuje a není povoleno v textech.

Znak U+FEFF je v UTF-16 reprezentován bajtovou sekvencí 0xFE 0xFF (big-endian) nebo 0xFF 0xFE (little-endian) a v UTF-32 bajtovou sekvencí 0x00 0x00 0xFE 0xFF (big-endian) popř. 0xFF 0xFE 0x00 0x00 (little -endian).

Problémy s kompatibilitou a převodem

Zápis vícebajtového čísla z paměti počítače do souboru nebo jeho přenos po síti vyžaduje konvence o tom, který bajt se přenáší jako první. Přímý zápis v pořadí, ve kterém jsou byty umístěny v paměťových buňkách, vede k problémům jak při přenosu aplikace z platformy na platformu, tak při mezisystémové síťové výměně dat.

Pro převod mezi pořadím bajtů sítě , které je vždy big-endian, a pořadím bajtů hostitele poskytuje  standard POSIX funkce , , , : htonl()htons()ntohl()ntohs()

  • uint32_t htonl(uint32_t hostlong); - převede 32bitovou hodnotu bez znaménka z místního pořadí bajtů na pořadí bajtů v síti;
  • uint16_t htons(uint16_t hostshort); - převede 16bitovou hodnotu bez znaménka z místního pořadí bajtů na pořadí bajtů v síti;
  • uint32_t ntohl(uint32_t netlong); - převede 32bitovou hodnotu bez znaménka ze síťového pořadí bajtů na místní pořadí bajtů;
  • uint16_t ntohs(uint16_t netshort); — převede 16bitovou hodnotu bez znaménka ze síťového pořadí bajtů na místní pořadí bajtů.

Pokud se aktuální pořadí bajtů a síťová funkce shodují, budou fungovat jako „prázdné“ – to znamená, že pořadí bajtů se nezmění. Norma také umožňuje implementovat tyto funkce jako makra.

Existuje mnoho jazyků a knihoven se zařízeními pro převod do az obou hlavních objednávek bajtů.

Linuxové jádro : , le16_to_cpu(), cpu_to_be32()atd cpu_to_le16p().;

FreeBSD kernel : htobe16(), le32toh(), a tak dále;

Erlang :

<< Počet : 32 / velké - celé číslo bez znaménka , Průměr : 64 / velké - plovoucí >> = Chunk Zpráva = << Délka : 32 / little - unsigned - integer , MType : 16 / little - unsigned - integer , MessageBody >>

Python :

import struct Počet , Průměr = struct . rozbalit ( ">Ld" , Chunk ) Zpráva = struct . pack ( "<LH" , Length , MType ) + MessageBody

Perl :

( $Count , $Average ) = rozbalit ( 'L>d>' , $Chunk ); $Message = pack ( '(LS)<' , $Length , $MType ) . $MessageBody ; ( nebo totéž : $Message = pack ( 'Vv' , $Length , $MType ) . $ MessageBody ;)

tyto příklady pro Erlang, Python, Perl obsahují identické funkce.

Procesory Intel x86-64 mají instrukci BSWAP pro změnu pořadí bajtů.

Etymologie jména

Termíny big-endian a little-endian původně nesouvisely s informatikou. Gulliver 's Travels , satirické dílo Jonathana Swifta , popisuje fiktivní stavy Lilliputie a Blefusca, kteří spolu válčí mnoho let kvůli neshodě ohledně toho, z kterého konce by se měla rozbít vařená vejce . Ti, kteří věří, že je třeba je vytrhnout z tupého konce, se v práci nazývají Big-endians („tupé konce“).

Spory mezi zastánci big-endian a little-endian v informatice mají také často povahu tzv. „náboženské války“. [2] Termíny big-endian a little-endian zavedl Danny Cohen v roce 1980 ve svém článku On Holy Wars and a Plea for Peace .  [3] [4]

Viz také

Poznámky

  1. pack() v Perlu . Získáno 20. prosince 2010. Archivováno z originálu 13. prosince 2010.
  2. Často kladené otázky Endian společnosti DAV (odkaz dolů) . Získáno 3. srpna 2008. Archivováno z originálu dne 10. listopadu 2006. 
  3. Danny Cohen. On Holy Wars and a Plea for Peace  (anglicky) (1. dubna 1980). Datum přístupu: 24. ledna 2010. Archivováno z originálu 15. února 2012.
  4. Tanenbaum E. Architektura počítače. - 5. vyd. - Petrohrad. : Peter, 2007. - 844 s. - S. 89.

Odkazy