Array ( [0] => 14691318 [id] => 14691318 [1] => cswiki [site] => cswiki [2] => Endianita [uri] => Endianita [3] => [img] => [4] => [day_avg] => [5] => [day_diff] => [6] => [day_last] => [7] => [day_prev_last] => [8] => [oai] => [9] => [is_good] => [10] => [object_type] => [11] => 0 [has_content] => 0 [12] => [oai_cs_optimisticky] => ) Array ( [0] => '''Endianita''' ('''pořadí bajtů''', {{Vjazyce2|en|''byte order''}}) je v [[Informatika|informatice]] způsob uložení čísel v [[Operační paměť|operační paměti]] [[počítač]]e, který definuje, v jakém pořadí se uloží jednotlivé [[bajt]]y číselného [[datový typ|datového typu]]. Jde tedy o to, v jakém pořadí jsou v operační paměti uloženy jednotlivé řády čísel, které zabírají více než jeden bajt. [1] => [2] => == Endianita a kompatibilita == [3] => Endianita je jedním ze základních zdrojů nekompatibility při ukládání a výměně dat v digitální podobě. Je nutné brát ji v úvahu při přenášení binárních [[soubor]]ů nebo při [[počítačová síť|síťové]] komunikaci mezi různými platformami. Tento problém pramení z toho, že stejný zdrojový kód zkompilovaný pro počítače s různými procesory může kvůli jejich různé endianitě produkovat při ukládání nebo přenosu různá binární data. Nejrozšířenějším kódováním vícebajtových dat je v současnosti little endian, což je dané masovým rozšířením architektury [[x86|Intel x86]]. [4] => [5] => Zdrojem zmatků může být rovněž specifikace [[IEEE 754]], která nedefinuje, v jakém pořadí bajtů se mají ukládat čísla v plovoucí řádové čárce. Endianita může způsobovat problémy i při práci s texty v kódování [[unicode]], proto je rozumné tyto texty ukládat v kódování [[UTF-8]], které je nezávislé na architektuře počítače. [6] => [7] => Některé multiplatformní programy (např. [[OpenDocument]] nebo konkurenční [[Office Open XML]]) řeší problémy s hardwarovou endianitou tím, že ukládají data ve formě textů. I když problémy s kódováním se mohou vyskytnout i u textů, jsou mnohem snadněji řešitelné, protože nejsou dány hardwarem, ale pouze konvencí. Ve zmiňovaném případě OpenDocument a OOXML je tato konvence určena ISO normou. [8] => [9] => == Little-endian == [10] => V tomto případě se na paměťové místo s nejnižší adresou uloží [[nejméně významný bajt]] (''LSB'') a za něj se ukládají ostatní bajty až po [[nejvíce významný bajt]] (''MSB''). Architektury uplatňující tento princip se nazývají '''little-endian''' ([[mnemotechnická pomůcka]]: ''little end first'') a patří mezi ně [[MOS Technology 6502]], [[x86|Intel x86]], [[Apple M1]]{{Citace elektronického periodika [11] => | titul = Porting Your macOS Apps to Apple Silicon [12] => | periodikum = Apple Developer Documentation [13] => | url = https://docs.developer.apple.com/documentation/apple-silicon/porting-your-macos-apps-to-apple-silicon [14] => | jazyk = en-US [15] => | datum přístupu = 2023-12-19 [16] => }} a DEC [[VAX]]. [17] => [18] => Little endian má jednu dobrou vlastnost. Jedna a ta samá hodnota může být z paměti načtena pro různou délku, bez změny adresy. Například 32bitový řetězec FF 00 00 00 může být načten ze stejné adresy jako 8bitový (hodnota = FF), 16bitový (00FF), 24bitový (0000FF), 32bitový (000000FF); jejich hodnota stále zůstává 255. Tato vlastnost je však velmi zřídka využívána programátory, kteří pracují s vyššími programovacími jazyky, proto se ponechává kompilátoru. [19] => [20] => Např. 32[[bit]]ové číslo 0x4A3B2C1D se na adresu 100 uloží takto: [21] => {| border="1" cellpadding=4 style="border: 1px solid #ffffff; background-color: #ffffff; border-collapse: collapse; margin: 0.4em 0.4em; text-align: center" [22] => |- [23] => |style="padding: 0em 1em;"| [24] => |style="padding: 0em 1em;"| 100 [25] => |style="padding: 0em 1em;"| 101 [26] => |style="padding: 0em 1em;"| 102 [27] => |style="padding: 0em 1em;"| 103 [28] => |style="padding: 0em 1em;"| [29] => |- [30] => |style="border: 1px solid #000000; border-left: 1px solid #ffffff; padding: 0em 1em;"| ... [31] => |style="border: 1px solid #000000; padding: 0em 1em;"| 1D [32] => |style="border: 1px solid #000000; padding: 0em 1em;"| 2C [33] => |style="border: 1px solid #000000; padding: 0em 1em;"| 3B [34] => |style="border: 1px solid #000000; padding: 0em 1em;"| 4A [35] => |style="border: 1px solid #000000; border-right: 1px solid #ffffff; padding: 0em 1em;"| ... [36] => |} [37] => [38] => == Big-endian == [39] => V tomto případě se na paměťové místo s nejnižší adresou uloží [[nejvíce významný bajt]] (''MSB'') a za něj se ukládají ostatní bajty až po [[nejméně významný bajt]] (''LSB'') na konci. Architektury uplatňující tento princip se nazývají '''big-endian''' ([[mnemotechnická pomůcka]]: ''big end first'') a patří mezi ně [[Motorola 68000]], [[SPARC]] a [[System/370]]. [40] => [41] => Např. 32[[bit]]ové číslo 0x4A3B2C1D se na adresu 100 uloží takto: [42] => {| border="1" cellpadding=4 style="border: 1px solid #ffffff; background-color: #ffffff; border-collapse: collapse; margin: 0.4em 0.4em; text-align: center" [43] => |- [44] => |style="padding: 0em 1em;"| [45] => |style="padding: 0em 1em;"| 100 [46] => |style="padding: 0em 1em;"| 101 [47] => |style="padding: 0em 1em;"| 102 [48] => |style="padding: 0em 1em;"| 103 [49] => |style="padding: 0em 1em;"| [50] => |- [51] => |style="border: 1px solid #000000; border-left: 1px solid #ffffff; padding: 0em 1em;"| ... [52] => |style="border: 1px solid #000000; padding: 0em 1em;"| 4A [53] => |style="border: 1px solid #000000; padding: 0em 1em;"| 3B [54] => |style="border: 1px solid #000000; padding: 0em 1em;"| 2C [55] => |style="border: 1px solid #000000; padding: 0em 1em;"| 1D [56] => |style="border: 1px solid #000000; border-right: 1px solid #ffffff; padding: 0em 1em;"| ... [57] => |} [58] => [59] => == Middle-endian == [60] => Některé architektury označované '''middle-endian''' (nebo někdy '''mixed-endian''') užívají složitější způsob pro určení pořadí jednotlivých bajtů, který je dán kombinací obou výše zmíněných způsobů. Mezi takovéto architektury patří např. rodina procesorů [[PDP-11]]. Tento formát je také použit pro ukládání čísel s pohyblivou řádovou čárkou a dvojitou přesností v systémech VAX a [[ARM]]. [61] => [62] => Např. 32[[bit]]ové číslo 0x4A3B2C1D se na adresu 100 uloží takto: [63] => {| border="1" cellpadding=4 style="border: 1px solid #ffffff; background-color: #ffffff; border-collapse: collapse; margin: 0.4em 0.4em; text-align: center" [64] => |- [65] => |style="padding: 0em 1em;"| [66] => |style="padding: 0em 1em;"| 100 [67] => |style="padding: 0em 1em;"| 101 [68] => |style="padding: 0em 1em;"| 102 [69] => |style="padding: 0em 1em;"| 103 [70] => |style="padding: 0em 1em;"| [71] => |- [72] => |style="border: 1px solid #000000; border-left: 1px solid #ffffff; padding: 0em 1em;"| ... [73] => |style="border: 1px solid #000000; padding: 0em 1em;"| 3B [74] => |style="border: 1px solid #000000; padding: 0em 1em;"| 4A [75] => |style="border: 1px solid #000000; padding: 0em 1em;"| 1D [76] => |style="border: 1px solid #000000; padding: 0em 1em;"| 2C [77] => |style="border: 1px solid #000000; border-right: 1px solid #ffffff; padding: 0em 1em;"| ... [78] => |} [79] => [80] => nebo případně: [81] => [82] => {| border="1" cellpadding=4 style="border: 1px solid #ffffff; background-color: #ffffff; border-collapse: collapse; margin: 0.4em 0.4em; text-align: center" [83] => |- [84] => |style="padding: 0em 1em;"| [85] => |style="padding: 0em 1em;"| 100 [86] => |style="padding: 0em 1em;"| 101 [87] => |style="padding: 0em 1em;"| 102 [88] => |style="padding: 0em 1em;"| 103 [89] => |style="padding: 0em 1em;"| [90] => |- [91] => |style="border: 1px solid #000000; border-left: 1px solid #ffffff; padding: 0em 1em;"| ... [92] => |style="border: 1px solid #000000; padding: 0em 1em;"| 2C [93] => |style="border: 1px solid #000000; padding: 0em 1em;"| 1D [94] => |style="border: 1px solid #000000; padding: 0em 1em;"| 4A [95] => |style="border: 1px solid #000000; padding: 0em 1em;"| 3B [96] => |style="border: 1px solid #000000; border-right: 1px solid #ffffff; padding: 0em 1em;"| ... [97] => |} [98] => [99] => == Endianity v souborech == [100] => Pokud je binární soubor vytvořen a následně čten na počítačích, které mají různou endianitu, může vzniknout problém. Některé [[překladač]]e mají vestavěná zařízení, která pracují s údaji zapsanými v jiných formátech. Například [[překladač|kompilátor]] Intel Fortran podporuje nestandardní CONVERT specifikátor, takže soubor lze otevřít jako: [101] => [102] => OPEN (unit, CONVERT = 'BIG_ENDIAN',...) [103] => [104] => nebo [105] => [106] => OPEN (unit, CONVERT = 'LITTLE_ENDIAN',...) [107] => [108] => Pokud kompilátor převod nepodporuje, musí záměnu bajtů (angl. ''byte swap'') provést programátor. Neformátované sekvenční soubory v jazyce [[Fortran]] vytvořené s jednou endianitou obvykle není možné číst na systému pomocí jiné endianity. [[Fortran]] obvykle provádí záznam (napsán jediným příkazem [[Fortran]]u) jako data a pole. Ta jsou rovna celočíselným bytům v datech. Pokus o čtení těchto souborů v systému s jinými endianitami má pak za následek provozní chybu, protože pole počítače jsou nesprávná. Tomuto problému se lze vyhnout tím, že píšeme přímo do sekvenčního binárního souboru. [109] => [110] => Aplikace formátující binární data, jako je například [[MATLAB]] .mat soubory, nebo formát dat BIL, používané v [[topografie|topografii]], jsou obvykle nezávislé na endianitách. [111] => [112] => Tohoto je dosaženo uložením dat vždy v jedné pevné endianitě nebo když spolu s údaji neseme příznak, který určí, s kterou endianitou byla data zapsána. Při čtení souboru převede aplikace endianity, je-li třeba. Tento postup je pro uživatele transparentní. [113] => [114] => To je případ obrazových souborů [[Tagged Image File Format|TIFF]], které informují ve svém záhlaví o endianitě použitých čísel. Pokud soubor začíná signaturou "MM", znamená to, že celá čísla jsou reprezentována jako velký endian, zatímco "II" endian malý. Každá z těchto signatur zabere jediné 16bitové slovo. Jsou typu [[palindrom]] (to znamená, že se čtou stejně dopředu i dozadu), takže jsou nezávislé endianitách. "I" znamená [[Intel]] a "M" znamená [[Motorola]]. Procesory [[Intel]] používají malý endian, zatímco procesory [[Motorola]] 680x0 velký endian. Tento explicitní podpis umožňuje čtecímu programu obrazových souborů [[Tagged Image File Format|TIFF]] výměnu bytů, a to pouze v případě, byl-li daný soubor vygenerován zapisovacím programem [[Tagged Image File Format|TIFF]] běžícím na počítači s jinou endianitou. [115] => [116] => I když je programovací prostředí LabVIEW nejčastěji instalováno na počítačích s operačním systémem Windows, bylo nejprve vyvinuto pro Macintosh. Formát velkého endianu je používán pro binární čísla, zatímco většina Windows používá malý endian. [117] => [118] => Za povšimnutí stojí fakt, že neexistuje obecný nástroj pro přeměnu endianit v souborech. Ke správnému převodu nutno znát strukturu souboru. Potřebná výměna bajtů závisí totiž na délce proměnných uložených v souboru (čtyřbajtové celé číslo vyžaduje jiný převod než dvojice dvoubajtových celých čísel). [119] => [120] => == Programování == [121] => [122] => === Konverze mezi little-endian a big-endian (jazyk C) === [123] => Následující výpočty přehazují bajty z kódování little-endian na big-endian a naopak. Použití standardního C-jazyka vede k lepší přenositelnosti kódu. Zpracování pomocí strojových instrukcí je rychlejší, což může hrát roli při zpracování velkých souborů dat, nebo velkých datových toků. Syntaxe zápisu je provedena na způsob maker v [[C (programovací jazyk)|jazyce C]]. [124] => [125] => Aby se konverze provedla správně, musíme vědět jaký počet bajtů používá daný kompilátor C-jazyka pro určitý datový typ. Definice C-jazyka podle ANSI neurčuje, že např. typ int musí mít 32 bitů. [126] => [127] => ==== 16bitový swap ==== [128] => [129] => #define BSWAP16(n) ((n) << 8 | ((n) >> 8 & 0x00FF)) [130] => [131] => [132] => ==== 32bitový swap ==== [133] => [134] => #define BSWAP32(n) (((n) & 0xFF000000L >> 24) | ((n) & 0x00FF0000L >> 8) | ((n) & 0x0000FF00L << 8) | ((n) & 0x000000FF << 24)) [135] => [136] => [137] => ==== 64bitový swap ==== [138] => [139] => #define BSWAP64(n) ((n) >> 56) | (((n) << 40) & 0x00FF000000000000LL) | \ [140] => (((n) << 24) & 0x0000FF0000000000LL) | \ [141] => (((n) << 8) & 0x000000FF00000000LL) | \ [142] => (((n) >> 8) & 0x00000000FF000000LL) | \ [143] => (((n) >> 24) & 0x0000000000FF0000LL) | \ [144] => (((n) >> 40) & 0x000000000000FF00LL) | \ [145] => ((n) << 56) [146] => [147] => [148] => ==== Použití struktury union ==== [149] => Následující kód demonstruje "přehazování" bajtů 32bitového datového typu. Obecně jde o poměrně neefektivní způsob konverze endianity, ale např. při smíšené endianitě by může být názornost tohoto postupu výhodou. [150] => [151] => [152] => int32_t BSWAP32(int32_t data) [153] => { [154] => int i, i2, tmp; [155] => union { [156] => int32_t val; [157] => uint8_t bytes[sizeof(int32_t)]; [158] => } lf; [159] => lf.val = data; [160] => for(i = 0, i2 = sizeof(int32_t) -1; i < sizeof(int32_t) / 2; i++, i2--) [161] => { [162] => tmp = lf.bytes[i]; [163] => lf.bytes[i] = lf.bytes[i2]; [164] => lf.bytes[i2] = tmp; [165] => } [166] => return lf.val; [167] => } [168] => [169] => [170] => === Architektura 80486 a odvozené === [171] => Tato instrukce je k dispozici pouze na platformách Intel počínaje řadou 80486 (včetně) dál (486+) existuje pro konverzi endianity [[strojová instrukce]] bswap[http://web.itu.edu.tr/kesgin/mul06/intel/instr/bswap.html Intel Instruction Set (bswap)]. Tato instrukce slouží ke konverzi 32bitových nebo 64bitových hodnot z little-endian na big-endian a naopak. Zápis (použití) je následující: [172] => [173] => [174] => BSWAP reg32 [175] => BSWAP reg64 [176] => [177] => [178] => Bere buď 32bitový nebo 64bitový registr. Pokud by se použil se 16bitovým registrem, zanechá jej beze změny a nic se neprovede. Pro 16bitový operand a změnu endianity lze na procesorech x86 provést instrukce XCHG, např.: [179] => [180] => [181] => XCHG al, ah [182] => [183] => [184] => ==== Použití instrukce BSWAP v GCC ==== [185] => Tuto instrukci je možno použít nepřímo voláním speciálního konstruktu překladače [[GCC]] (pro jazyk C/C++) od verze 4.3. Jedná se o vestavěnou (built-in) funkci, proto není potřeba vkládat žádný hlavičkový soubor, ani přilinkovat žádnou knihovnu (GCC místo nich vkládá přímo instrukce). Výhodou těchto funkcí je, že pokud daná platforma nemá instrukce pro bitovou konverzi mezi little-endian a big-endinan, vloží místo nich optimalizovaný kód. [186] => [187] => ===== Prototyp pro 32bitový swap ===== [188] => [189] => int32_t __builtin_bswap32 (int32_t x); [190] => [191] => [192] => Vrací 32bitovou hodnotu, která obsahuje přehozenou hodnotu 32bitové proměnné x (0x11223344 → 0x44332211). [193] => [194] => ===== Prototyp pro 64bitový swap ===== [195] => [196] => int64_t __builtin_bswap64 (int64_t x); [197] => [198] => [199] => Podobně jako __builtin_bswap32, ale pracuje s 64bitovými hodnotami (jak parametr, tak i návratová hodnota). [200] => [201] => Pro 16bitovou konverzi neexistuje v GCC vestavěná (built-in) funkce. [202] => [203] => === Visual C++ === [204] => V jazyce [[C++]] je potřeba vložit hlavičkový soubor intrin.h. [205] => [206] => ==== 16bitový swap ==== [207] => [208] => unsigned short _byteswap_ushort(unsigned short value); [209] => [210] => [211] => ==== 32bitový swap ==== [212] => [213] => unsigned long _byteswap_ulong(unsigned long value); [214] => [215] => [216] => ==== 64bitový swap ==== [217] => [218] => unsigned __int64 _byteswap_uint64(unsigned __int64 value); [219] => [220] => [221] => === Detekce === [222] => Detekci endianity je možné provést jak při překladu, tak při spuštění programu. [223] => [224] => ==== Při překladu (Unix) ==== [225] => Detekce při překladu by měla být preferována, protože se provede pouze jednou a výsledný program je tak jako tak závislý na dané platformě, kde byl překompilován. Ve většině [[UN*X|unixových systémů]] je k dispozici [[hlavičkový soubor]] sys/param.h, který kromě jiného poskytuje informace o pořadí bajtů (byte order). Definuje makra __BYTE_ORDER, __LITTLE_ENDIAN, __BIG_ENDIAN, a další, která lze využít např. následovně: [226] => [227] => [228] => #include [229] => [230] => #ifdef __BYTE_ORDER [231] => # if __BYTE_ORDER == __LITTLE_ENDIAN [232] => # define ENDIAN_DEFAULT ENDIAN_LITTLE [233] => # elif __BYTE_ORDER == __BIG_ENDIAN [234] => # define ENDIAN_DEFAULT ENDIAN_BIG [235] => # else [236] => # error "Unknown byte order" /* Middle-endian? */ [237] => # endif [238] => #endif /* __BYTE_ORDER */ [239] => [240] => [241] => Dalším možným přístupem je rozhodnutí na základě znalosti endianity příslušné platformy. To může být komplikované, protože se jména maker (symbolických konstant) mohou lišit v závislosti na použitém překladači a zároveň nemusí být možné podchytit všechny platformy (včetně hybridních architektur). [242] => [243] => [244] => #if defined (i386) || defined (__i386__) || defined (__alpha) || defined (vax) [245] => # define ENDIAN_DEFAULT ENDIAN_LITTLE [246] => #else [247] => # define ENDIAN_DEFAULT ENDIAN_BIG [248] => #endif [249] => [250] => [251] => ==== Za běhu ==== [252] => Pokud nejsou k dispozici žádná makra, je možné použít výpočet za běhu programu. Obě následující funkce vrací 1, když je platforma big-endian, jinak vrací 0. [253] => [254] => [255] => int is_big_endian() [256] => { [257] => static const int i = 1; [258] => return *((char *)&i) == 0; [259] => } [260] => [261] => [262] => Ve výše uvedeném kódu je do proměnné i (u které předpokládáme délku 32 bitů) uložena hodnota 1. V závislosti na endianitě dané platformy, se číslo uloží buď jako posloupnost bajtů {0x00,0x00,0x00,0x01} (big-endian) nebo jako posloupnost bajtů {0x01,0x00,0x00,x00} (little-endian). Funkce is_big_endian pouze kontroluje, jakou hodnotu obsahuje první bajt proměnné i. [263] => [264] => ===== Použití struktury union (Harbison and Steele) ===== [265] => Příklad použití struktury union:''C: A Reference Manual.'' Samuel P. Harbison and Guy L. Steele, Jr. Third edition; Prentice-Hall, 1991, {{ISBN|0-13-110933-2}} [266] => [267] => [268] => [269] => int is_big_endian() [270] => { [271] => union test_union [272] => { [273] => int i; [274] => char c; [275] => }; [276] => [277] => static const union test_union s_t = { 1 }; [278] => return s_t.c == 0; [279] => } [280] => [281] => [282] => == Reference == [283] => [284] => [285] => == Externí odkazy == [286] => * {{commonscat}} [287] => * [http://unixpapa.com/incnote/byteorder.html Unix Incompatibility Notes: Byte Order] [288] => * [https://web.archive.org/web/20111016002758/http://oopweb.com/Assembly/Documents/ArtOfAssembly/Volume/Chapter_6/CH06-1.html#HEADING1-291 The Art of ASSEMBLY LANGUAGE PROGRAMMING (The BSWAP Instruction)] [289] => [290] => {{Pahýl}} [291] => {{Autoritní data}} [292] => [293] => [[Kategorie:Počítače]] [294] => [[Kategorie:Kódování znaků]] [] => )
good wiki

Endianita

Endianita (pořadí bajtů) je v informatice způsob uložení čísel v operační paměti počítače, který definuje, v jakém pořadí se uloží jednotlivé bajty číselného datového typu. Jde tedy o to, v jakém pořadí jsou v operační paměti uloženy jednotlivé řády čísel, které zabírají více než jeden bajt.

More about us

About

Expert Team

Vivamus eget neque lacus. Pellentesque egauris ex.

Award winning agency

Lorem ipsum, dolor sit amet consectetur elitorceat .

10 Year Exp.

Pellen tesque eget, mauris lorem iupsum neque lacus.

You might be interested in

,'Fortran','Tagged Image File Format','bit','x86','Intel','Motorola','nejvíce významný bajt','mnemotechnická pomůcka','nejméně významný bajt','překladač','PDP-11','UN*X'