Ця стаття потребує додаткових для поліпшення її . |
Порядок байтів (англ. Endianness, byte order) — метод запису байтів багатобайтових чисел в інформатиці. У програмуванні, інформація в пам'яті зазвичай зберігається у двійкових даних, розділена на 8 біт (один байт).
У загальному випадку, для представлення числа M, більшого 255 ( — максимальне ціле число, що записується одним октетом), доводиться використовувати декілька байтів-октетів. При цьому число M записується в позиційній системі числення за основою 256:
Набір цілих чисел кожне з яких лежить в інтервалі від 0 до 255, є послідовністю байтів, складових числа M. при цьому називається молодшим байтом, а — старшим байтом числа M.
Походження назви
В англійській мові терміни big-endian і little-endian запозичено у Джонатана Свіфта з його сатиричного твору Мандри Гуллівера, де описуються держави Ліліпутія та Блефуску, що вели між собою нескінченні війни через розбіжність із якого кінця слід розбивати варені яйця: з «гострого» (англ. little-endian) чи з «тупого» (англ. big-endian).
Варіанти запису
Порядок від старшого до молодшого
Порядок від старшого до молодшого або (англ. big-endian, дослівно: «тупокінцевий»): . Запис починається зі старшого байту й закінчується молодшим. Так записують числа на папері й цей порядок є стандартним для протоколів (TCP/IP), він застосовується в заголовках пакетів даних і в багатьох протоколах вищого рівня, розроблених для застосування поверх (TCP/IP). Тому, порядок байтів від старшого до молодшого часто називають мережевим порядком байтів (англ. network byte order). Обробку чисел із таким порядком байтів апаратно реалізовано в комп'ютерах (IBM System/360), (IBM System/370), (IBM System/390), Motorola 68000, SPARC (звідси третя назва — порядок байтів Motorola, Motorola byte order).
Порядок від молодшого до старшого
Порядок від молодшого до старшого або (англ. little-endian, дослівно: «гострокінцевий»): , запис починається з наймолодшого байту й закінчується найстаршим. Такий порядок запису прийнятий у пам'яті комп'ютерів з процесорами Intel, у яких його було апаратно реалізовано, у зв'язку з чим іноді його називають «інтелівський» порядок байтів (за назвою фірми-розробника архітектури x86). Подекуди, наприклад, у документації Perl, вживається назва «VAX order».
Такий порядок застосовується в USB, конфігурації PCI, таблиця розділів GUID, рекомендаціях FidoNet, однак маловживаний у крос-платформних протоколах і форматах даних.
Змінюваний порядок
Деякі процесори можуть працювати і з порядком від молодшого до старшого, і зі зворотнім, наприклад, ARM, PowerPC (але не PowerPC 970), DEC Alpha, MIPS, PA-RISC і IA-64. Зазвичай порядок байтів вибирається програмно під час ініціалізації операційної системи, але може бути вибраний і апаратними перемичками на материнській платі. У цьому випадку правильніше говорити про порядок байтів операційної системи. Змінюваний порядок байтів іноді називають англ. bi-endian.
Змішаний порядок
Змішаний порядок байтів (англ. middle-endian) іноді застосовується при роботі з числами, довжина яких перевищує машинне слово. У машинному слові байти зберігаються в порядку, природному для даної архітектури, але самі слова йдуть у зворотному порядку.
Класичний приклад middle-endian — представлення 4-байтних цілих чисел на 16-бітних процесорах сімейства PDP- 11 (відомий як PDP-endian) . Для представлення двобайтних значень (слів) застосовувався апаратний порядок: спочатку молодший байт, потім — старший. Але в подвійному (4-байтному) слові записувалося спочатку старше слово, а потім молодше.
У процесорах VAX і ARM застосовується змішаний порядок для довгих дійсних чисел.
Приклад
Далі наведено приклад, в якому описується розміщення 4-байтового числа в ОЗП ЕОМ, доступ до якого може здійснюватися і як до 32-розрядного слова, так і побайтово.
Всі числа записані в 16-ковій системі числення.
Представлення | D4*0x01 + C3*0x100 + B2*0x10000 + A1*0x1000000 | |
Порядок від молодшого до старшого | (little-endian) | 0xD4, 0xC3, 0xB2, 0xA1 |
Порядок від старшого до молодшого | (big-endian) | 0xA1, 0xB2, 0xC3, 0xD4 |
Порядок, прийнятний в PDP-11 | (PDP-endian) | 0xB2, 0xA1, 0xD4, 0xC3 |
Порівняння
Істотною перевагою little-endian у порівнянні з big-endian вважається[] можливість «неявної типізації» цілих чисел при читанні меншого обсягу байт (за умови, що прочитане число вміщується в діапазон). Так, якщо в комірці пам'яті міститься число 0x00000022, то прочитавши один байт отримаємо число 0x22, прочитавши два байти (int16) — число 0x0022 і т.д. Однак, це ж може вважатися одночасно недоліком, тому що може спричинити помилки втрати даних.
Недоліком little-endian (у порівнянні з big-endian) вважається[] «неочевидність» значення байтів пам'яті, наприклад, при налагодженні: послідовність байтів (A1, B2, C3, D4) означає число 0xD4C3B2A1, тоді як у big-endian ця послідовність (A1, B2, C3, D4) читається «природним» для арабського запису чисел чином — 0xA1B2C3D4. Найменш зручним у роботі вважається middle-endian формат запису. Він зберігся тільки на старих платформах. Для запису довгих чисел (чисел, довжина яких істотно перевищує розрядність машини) зазвичай переважає порядок слів little-endian (оскільки більшість арифметичних операцій над довгими числами здійснюються від молодших розрядів до старших). Порядок байтів в слові — звичайний для такої архітектури.
Проблеми сумісності
Запис багатобайтового числа з пам'яті комп'ютера в файл або передача по мережі потребує дотримання відповідностей про те, який з байтів є старшим, а який молодшим. Прямий запис комірок пам'яті призводить до можливих проблем при перенесенні додатку з платформи на платформу.
Визначення порядку байтів
Порядок байтів в конкретній машині можна визначити за допомогою програми на мові Сі (testendian.c):
#include <stdio.h> unsigned short x = 1; /* 0x0001 */ int main(void) { printf("%s\n", *((unsigned char *) &x) == 0 ? "big-endian" : "little-endian"); return 0; }
Вивід даної програми має сенс тільки на платформах, де розмір типу unsigned short більший, ніж розмір типу unsigned char. Це правильно на переважній більшості комп'ютерів, оскільки вони мають 8-розрядний байт. Однак існують і апаратні платформи, в яких розмір байта рівний розміру слова (або, в термінах мови C: sizeof (char) == sizeof (int)
). Наприклад, в суперкомп'ютерах Cray.
Результати запуску на big-endian машині (SPARC):
$ uname -m sparc64 $ gcc -o testendian testendian.c $ ./testendian big-endian
Результати запуску на little-endian машині (x86):
$ uname -m i386 $ gcc -o testendian testendian.c $ ./testendian little-endian
Дійсні числа
Зберігання дійсних чисел може залежати від порядку байт; так, на x86 використовуються формати IEEE 754 зі знаком і порядком числа в старших байтах.
Юнікод
Якщо Юнікод записаний у вигляді UTF-16 або UTF-32, то порядок байтів є суттєвим. Одним із способів позначення порядку байтів в юнікодових текстах є встановлення на початку спеціального символу BOM (byte-order mark), маркер послідовності байтів, U+FEFF — «перевернутий» варіант цього символу (U+FFFE) не існує і не допускається в текстах.
Символ U+FEFF зображується в UTF-16 послідовністю байтів 0xFE 0xFF
(big-endian) або 0xFF 0xFE
(little-endian), а в UTF-32 — послідовністю 0x00 0x00 0xFE 0xFF
(big-endian) або 0xFF 0xFE 0x00 0x00
(little-endian).
Конвертація
Для перетворення між мережним порядком байтів (англ. network byte order), який завжди у форматі big-endian, і порядком байтів, що використовується на машині (англ. host byte order), стандарт POSIX передбачає функції htonl (), htons (), ntohl (), ntohs ():
uint32_t htonl (uint32_t hostlong);
— конвертує 32-бітну беззнакову величину з локального порядку байтів в мережевій;uint16_t htons (uint16_t hostshort);
— конвертує 16-бітну беззнакову величину з локального порядку байтів в мережевій;
uint32_t ntohl (uint32_t netlong);
— конвертує 32-бітну беззнакову величину з мережевого порядку байтів в локальний;uint16_t ntohs (uint16_t netshort);
— конвертує 16-бітну беззнакову величину з мережевого порядку байтів в локальний.
У разі збігу поточного порядку байтів і мережевого, функції можуть бути «порожніми» (тобто, не змінювати порядку байтів). Стандарт також допускає, щоб ці функції були реалізовані макросами.
Існує багато мов і бібліотек із засобами конвертації в обидва основні порядку байт і навпаки.
Ядро Linux: le16_to_cpu (), cpu_to_be32 (), cpu_to_le16p (), і так далі;
Ядро FreeBSD: htobe16 (), le32toh (), і так далі;
<<Count:32/big-unsigned-integer, Average:64/big-float>> = Chunk Message = <<Length:32/little-unsigned-integer, MType:16/little-unsigned-integer, MessageBody>>
import struct Count, Average = struct.unpack(">Ld", Chunk) Message = struct.pack("<LH", Length, MType) + MessageBody
Perl:
($Count, $Average) = unpack('L>d>', $Chunk); $Message = pack('(LS)<', $Length, $MType) . $MessageBody; (або те ж саме: $Message = pack('Vv', $Length, $MType) . $MessageBody;)
дані приклади для Erlang, Python, Perl містять ідентичну функціональність.
Примітки
- pack() в Perl
Посилання
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Cya stattya potrebuye dodatkovih posilan na dzherela dlya polipshennya yiyi perevirnosti Bud laska dopomozhit udoskonaliti cyu stattyu dodavshi posilannya na nadijni avtoritetni dzherela Zvernitsya na storinku obgovorennya za poyasnennyami ta dopomozhit vipraviti nedoliki Material bez dzherel mozhe buti piddano sumnivu ta vilucheno Poryadok bajtiv angl Endianness byte order metod zapisu bajtiv bagatobajtovih chisel v informatici U programuvanni informaciya v pam yati zazvichaj zberigayetsya u dvijkovih danih rozdilena na 8 bit odin bajt Predstavlennya danih u pam yati komp yutera U zagalnomu vipadku dlya predstavlennya chisla M bilshogo 255 255 2 8 1 displaystyle 255 2 8 1 maksimalne cile chislo sho zapisuyetsya odnim oktetom dovoditsya vikoristovuvati dekilka bajtiv oktetiv Pri comu chisloM zapisuyetsya v pozicijnij sistemi chislennya za osnovoyu 256 M i 0 n A i 256 i A 0 256 0 A 1 256 1 A 2 256 2 A n 256 n displaystyle M sum i 0 n A i cdot 256 i A 0 cdot 256 0 A 1 cdot 256 1 A 2 cdot 256 2 dots A n cdot 256 n Nabir cilih chisel A 0 A n displaystyle A 0 dots A n kozhne z yakih lezhit v intervali vid 0 do 255 ye poslidovnistyu bajtiv skladovih chisla M pri comu A 0 displaystyle A 0 nazivayetsya molodshim bajtom a A n displaystyle A n starshim bajtomchisla M Pohodzhennya nazviV anglijskij movi termini big endian i little endian zapozicheno u Dzhonatana Svifta z jogo satirichnogo tvoru Mandri Gullivera de opisuyutsya derzhavi Liliputiya ta Blefusku sho veli mizh soboyu neskinchenni vijni cherez rozbizhnist iz yakogo kincya slid rozbivati vareni yajcya z gostrogo angl little endian chi z tupogo angl big endian Varianti zapisuPoryadok vid starshogo do molodshogo Poryadok vid starshogo do molodshogo Poryadok vid starshogo do molodshogo abo angl big endian doslivno tupokincevij A n A 0 displaystyle A n dots A 0 Zapis pochinayetsya zi starshogo bajtu j zakinchuyetsya molodshim Tak zapisuyut chisla na paperi j cej poryadok ye standartnim dlya protokoliv TCP IP vin zastosovuyetsya v zagolovkah paketiv danih i v bagatoh protokolah vishogo rivnya rozroblenih dlya zastosuvannya poverh TCP IP Tomu poryadok bajtiv vid starshogo do molodshogo chasto nazivayut merezhevim poryadkom bajtiv angl network byte order Obrobku chisel iz takim poryadkom bajtiv aparatno realizovano v komp yuterah IBM System 360 IBM System 370 IBM System 390 Motorola 68000 SPARC zvidsi tretya nazva poryadok bajtiv Motorola Motorola byte order Poryadok vid molodshogo do starshogo Poryadok vid molodshogo do starshogo Poryadok vid molodshogo do starshogo abo angl little endian doslivno gostrokincevij A 0 A n displaystyle A 0 dots A n zapis pochinayetsya z najmolodshogo bajtu j zakinchuyetsya najstarshim Takij poryadok zapisu prijnyatij u pam yati komp yuteriv z procesorami Intel u yakih jogo bulo aparatno realizovano u zv yazku z chim inodi jogo nazivayut intelivskij poryadok bajtiv za nazvoyu firmi rozrobnika arhitekturi x86 Podekudi napriklad u dokumentaciyi Perl vzhivayetsya nazva VAX order Takij poryadok zastosovuyetsya v USB konfiguraciyi PCI tablicya rozdiliv GUID rekomendaciyah FidoNet odnak malovzhivanij u kros platformnih protokolah i formatah danih Zminyuvanij poryadok Deyaki procesori mozhut pracyuvati i z poryadkom vid molodshogo do starshogo i zi zvorotnim napriklad ARM PowerPC ale ne PowerPC 970 DEC Alpha MIPS PA RISC i IA 64 Zazvichaj poryadok bajtiv vibirayetsya programno pid chas inicializaciyi operacijnoyi sistemi ale mozhe buti vibranij i aparatnimi peremichkami na materinskij plati U comu vipadku pravilnishe govoriti pro poryadok bajtiv operacijnoyi sistemi Zminyuvanij poryadok bajtiv inodi nazivayut angl bi endian Zmishanij poryadok Zmishanij poryadok bajtiv angl middle endian inodi zastosovuyetsya pri roboti z chislami dovzhina yakih perevishuye mashinne slovo U mashinnomu slovi bajti zberigayutsya v poryadku prirodnomu dlya danoyi arhitekturi ale sami slova jdut u zvorotnomu poryadku Klasichnij priklad middle endian predstavlennya 4 bajtnih cilih chisel na 16 bitnih procesorah simejstva PDP 11 vidomij yak PDP endian Dlya predstavlennya dvobajtnih znachen sliv zastosovuvavsya aparatnij poryadok spochatku molodshij bajt potim starshij Ale v podvijnomu 4 bajtnomu slovi zapisuvalosya spochatku starshe slovo a potim molodshe U procesorah VAX i ARM zastosovuyetsya zmishanij poryadok dlya dovgih dijsnih chisel Priklad Dali navedeno priklad v yakomu opisuyetsya rozmishennya 4 bajtovogo chisla v OZP EOM dostup do yakogo mozhe zdijsnyuvatisya i yak do 32 rozryadnogo slova tak i pobajtovo Vsi chisla zapisani v 16 kovij sistemi chislennya Chislo 0xA1B2C3D4 Predstavlennya D4 0x01 C3 0x100 B2 0x10000 A1 0x1000000 Poryadok vid molodshogo do starshogo little endian 0xD4 0xC3 0xB2 0xA1 Poryadok vid starshogo do molodshogo big endian 0xA1 0xB2 0xC3 0xD4 Poryadok prijnyatnij v PDP 11 PDP endian 0xB2 0xA1 0xD4 0xC3 Porivnyannya Rozmishennya bajtiv slova v pam yati Big endian ta Little endian mashin Istotnoyu perevagoyu little endian u porivnyanni z big endian vvazhayetsya dzherelo mozhlivist neyavnoyi tipizaciyi cilih chisel pri chitanni menshogo obsyagu bajt za umovi sho prochitane chislo vmishuyetsya v diapazon Tak yaksho v komirci pam yati mistitsya chislo 0x00000022 to prochitavshi odin bajt otrimayemo chislo 0x22 prochitavshi dva bajti int16 chislo 0x0022 i t d Odnak ce zh mozhe vvazhatisya odnochasno nedolikom tomu sho mozhe sprichiniti pomilki vtrati danih Nedolikom little endian u porivnyanni z big endian vvazhayetsya dzherelo neochevidnist znachennya bajtiv pam yati napriklad pri nalagodzhenni poslidovnist bajtiv A1 B2 C3 D4 oznachaye chislo 0xD4C3B2A1 todi yak u big endian cya poslidovnist A1 B2 C3 D4 chitayetsya prirodnim dlya arabskogo zapisu chisel chinom 0xA1B2C3D4 Najmensh zruchnim u roboti vvazhayetsya middle endian format zapisu Vin zberigsya tilki na starih platformah Dlya zapisu dovgih chisel chisel dovzhina yakih istotno perevishuye rozryadnist mashini zazvichaj perevazhaye poryadok sliv little endian oskilki bilshist arifmetichnih operacij nad dovgimi chislami zdijsnyuyutsya vid molodshih rozryadiv do starshih Poryadok bajtiv v slovi zvichajnij dlya takoyi arhitekturi Problemi sumisnostiZapis bagatobajtovogo chisla z pam yati komp yutera v fajl abo peredacha po merezhi potrebuye dotrimannya vidpovidnostej pro te yakij z bajtiv ye starshim a yakij molodshim Pryamij zapis komirok pam yati prizvodit do mozhlivih problem pri perenesenni dodatku z platformi na platformu Viznachennya poryadku bajtivPoryadok bajtiv v konkretnij mashini mozhna viznachiti za dopomogoyu programi na movi Si testendian c include lt stdio h gt unsigned short x 1 0x0001 int main void printf s n unsigned char amp x 0 big endian little endian return 0 Vivid danoyi programi maye sens tilki na platformah de rozmir tipu unsigned short bilshij nizh rozmir tipu unsigned char Ce pravilno na perevazhnij bilshosti komp yuteriv oskilki voni mayut 8 rozryadnij bajt Odnak isnuyut i aparatni platformi v yakih rozmir bajta rivnij rozmiru slova abo v terminah movi C sizeof char sizeof int Napriklad v superkomp yuterah Cray Rezultati zapusku na big endian mashini SPARC uname m sparc64 gcc o testendian testendian c testendian big endian Rezultati zapusku na little endian mashini x86 uname m i386 gcc o testendian testendian c testendian little endianDijsni chislaZberigannya dijsnih chisel mozhe zalezhati vid poryadku bajt tak na x86 vikoristovuyutsya formati IEEE 754 zi znakom i poryadkom chisla v starshih bajtah YunikodYaksho Yunikod zapisanij u viglyadi UTF 16 abo UTF 32 to poryadok bajtiv ye suttyevim Odnim iz sposobiv poznachennya poryadku bajtiv v yunikodovih tekstah ye vstanovlennya na pochatku specialnogo simvolu BOM byte order mark marker poslidovnosti bajtiv U FEFF perevernutij variant cogo simvolu U FFFE ne isnuye i ne dopuskayetsya v tekstah Simvol U FEFF zobrazhuyetsya v UTF 16 poslidovnistyu bajtiv 0xFE 0xFF big endian abo 0xFF 0xFE little endian a v UTF 32 poslidovnistyu 0x00 0x00 0xFE 0xFF big endian abo 0xFF 0xFE 0x00 0x00 little endian KonvertaciyaDlya peretvorennya mizh merezhnim poryadkom bajtiv angl network byte order yakij zavzhdi u formati big endian i poryadkom bajtiv sho vikoristovuyetsya na mashini angl host byte order standart POSIX peredbachaye funkciyi htonl htons ntohl ntohs uint32 t htonl uint32 t hostlong konvertuye 32 bitnu bezznakovu velichinu z lokalnogo poryadku bajtiv v merezhevij uint16 t htons uint16 t hostshort konvertuye 16 bitnu bezznakovu velichinu z lokalnogo poryadku bajtiv v merezhevij uint32 t ntohl uint32 t netlong konvertuye 32 bitnu bezznakovu velichinu z merezhevogo poryadku bajtiv v lokalnij uint16 t ntohs uint16 t netshort konvertuye 16 bitnu bezznakovu velichinu z merezhevogo poryadku bajtiv v lokalnij U razi zbigu potochnogo poryadku bajtiv i merezhevogo funkciyi mozhut buti porozhnimi tobto ne zminyuvati poryadku bajtiv Standart takozh dopuskaye shob ci funkciyi buli realizovani makrosami Isnuye bagato mov i bibliotek iz zasobami konvertaciyi v obidva osnovni poryadku bajt i navpaki Yadro Linux le16 to cpu cpu to be32 cpu to le16p i tak dali Yadro FreeBSD htobe16 le32toh i tak dali Erlang lt lt Count 32 big unsigned integer Average 64 big float gt gt Chunk Message lt lt Length 32 little unsigned integer MType 16 little unsigned integer MessageBody gt gt Python import struct Count Average struct unpack gt Ld Chunk Message struct pack lt LH Length MType MessageBody Perl Count Average unpack L gt d gt Chunk Message pack LS lt Length MType MessageBody abo te zh same Message pack Vv Length MType MessageBody dani prikladi dlya Erlang Python Perl mistyat identichnu funkcionalnist Primitkipack v PerlPosilannyahttp encyclopedia2 thefreedictionary com byte order