Порядок байтів: відмінності між версіями

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
[неперевірена версія][перевірена версія]
Вилучено вміст Додано вміст
Немає опису редагування
 
(Не показані 48 проміжних версій 18 користувачів)
Рядок 1: Рядок 1:
{{refimprove}}
[[Файл:Poryadok.svg|міні|501x501пкс|''Представлення даних у пам'яті комп'ютера'']]
'''Порядок байтів''' ({{lang-en|Endianness, byte order}}) — метод запису [[байт]]ів багатобайтових чисел в [[Інформатика|інформатиці]]. У програмуванні, інформація в пам'яті зазвичай зберігається у двійкових даних, розділена на 8 біт (один байт).

У загальному випадку, для представлення числа '''''M''''', більшого 255 (<math>255=2^8-1</math>&nbsp;— максимальне [[Цілі числа|ціле число]], що записується одним [[Октет (інформатика)|октетом]]), доводиться використовувати декілька байтів-октетів. При цьому число'' '''M''''' записується в позиційній системі числення за основою 256:
: <math>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.</math>
Набір цілих чисел <math>A_0,\dots,A_n</math> кожне з яких лежить в інтервалі від ''0 до 255'', є послідовністю [[байт]]ів, складових числа '''''M'''''. при цьому <math>A_0</math>називається ''молодшим байтом'', а <math>A_n</math>&nbsp;— ''старшим байтом ''числа '''''M'''''.

== Походження назви ==
В [[Англійська мова|англійській мові]] терміни ''big-endian'' і ''little-endian'' запозичено у [[Джонатан Свіфт|Джонатана Свіфта]] з його сатиричного твору [[Мандри Гуллівера]], де описуються держави Ліліпутія та Блефуску, що вели між собою нескінченні війни через розбіжність із якого кінця слід розбивати варені яйця: з «гострого» ({{lang-en|little-endian}}) чи з «тупого» ({{lang-en|big-endian}}).

== Варіанти запису ==

=== Порядок від старшого до молодшого ===
[[Файл:Big-Endian-fr.svg|thumb|138x138px|''Порядок від старшого до молодшого'']]
''Порядок від старшого до молодшого'' або ({{lang-en|big-endian}}, дослівно: «тупокінцевий»):&nbsp;<math>A_n,\dots,A_0</math>. Запис починається зі старшого байту й закінчується молодшим. Так записують числа на папері й цей порядок є стандартним для протоколів [[TCP/IP]], він застосовується в заголовках пакетів даних і в багатьох протоколах вищого рівня, розроблених для застосування поверх [[TCP/IP]]. Тому, порядок байтів від старшого до молодшого часто називають ''мережевим порядком байтів'' ({{lang-en|network byte order}}). Обробку чисел із таким порядком байтів апаратно реалізовано в комп'ютерах [[IBM System/360]], [[IBM System/370]], [[IBM System/390]], [[Motorola 68000]], [[SPARC]] (звідси третя назва&nbsp;— порядок байтів Motorola, Motorola byte order).

=== Порядок від молодшого до старшого ===
[[Файл:Little-Endian-fr.svg|thumb|140x140px|''Порядок від молодшого до старшого'']]
''Порядок від молодшого до старшого'' або ({{lang-en|little-endian}}, дослівно: «гострокінцевий»): <math>A_0,\dots,A_n</math>, запис починається з наймолодшого байту й закінчується найстаршим. Такий порядок запису прийнятий у пам'яті комп'ютерів з процесорами Intel, у яких його було апаратно реалізовано, у зв'язку з чим іноді його називають «інтелівський» порядок байтів (за назвою фірми-розробника архітектури [[x86]]). Подекуди, наприклад, у документації [[Perl]], вживається назва «{{lang|en|[[VAX]] order}}»<ref>[http://perldoc.perl.org/functions/pack.html pack() в Perl]</ref>.

Такий порядок застосовується в [[USB]], конфігурації [[PCI]], [[таблиця розділів GUID]], рекомендаціях [[FidoNet]], однак маловживаний у крос-платформних протоколах і форматах даних.

=== Змінюваний порядок ===
Деякі процесори можуть працювати і з порядком від молодшого до старшого, і зі зворотнім, наприклад, [[ARM]], [[PowerPC]] (але не PowerPC 970), [[DEC Alpha]], [[MIPS]], PA-RISC і [[IA-64]]. Зазвичай порядок байтів вибирається програмно під час ініціалізації [[Операційна система|операційної системи]], але може бути вибраний і апаратними перемичками на [[Материнська плата|материнській платі]]. У цьому випадку правильніше говорити про порядок байтів [[Операційна система|операційної системи]]. Змінюваний порядок байтів іноді називають {{lang-en|bi-endian}}.

=== Змішаний порядок ===
Змішаний порядок байтів ({{lang-en|middle-endian}}) іноді застосовується при роботі з числами, довжина яких перевищує машинне слово. У машинному слові байти зберігаються в порядку, природному для даної архітектури, але самі слова йдуть у зворотному порядку.

Класичний приклад ''middle-endian'' — представлення 4-байтних цілих чисел на 16-бітних процесорах сімейства [[PDP-11|PDP- 11]] (відомий як ''PDP-endian'') . Для представлення двобайтних значень (слів) застосовувався апаратний порядок: ''спочатку молодший байт, потім — старший''. Але в подвійному (4-байтному) слові записувалося ''спочатку старше слово, а потім молодше''.

У процесорах [[VAX]] і [[ARM]] застосовується змішаний порядок для довгих дійсних чисел.

=== Приклад ===
Далі наведено приклад, в якому описується розміщення 4-байтового числа в [[ОЗП]] ЕОМ, доступ до якого може здійснюватися і як до 32-розрядного слова, так і побайтово.

Всі числа записані в 16-ковій [[Система числення|системі числення]].
{| class="standard"
|+ Число: 0xA1B2C3D4
| colspan="2" |Представлення||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
|}

=== Порівняння ===
[[Файл:Endianmem.PNG|thumb|300px|right|Розміщення байтів слова в пам'яті Big-endian— та Little-endian-машин]]
[[Файл:Endianmem.PNG|thumb|300px|right|Розміщення байтів слова в пам'яті Big-endian— та Little-endian-машин]]
Істотною перевагою 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 (оскільки більшість арифметичних операцій над довгими числами здійснюються від молодших розрядів до старших). Порядок байтів в слові&nbsp;— звичайний для такої архітектури.
'''Порядок байтів''' - метод запису [[байтів]] багатобайтових чисел в [[Інформатика|інформатиці]].


== Проблеми сумісності ==
У загальному випадку, для представлення числа M, більшого 255 (тут <math>255=2^8-1</math> - максимальне ціле число, що записується одним [[Октет (інформатика)|октетом]]), доводиться використовувати декілька байтів-октетів. При цьому число'' M'' записується в позиційній системі числення за основою 256:
Запис багатобайтового числа з пам'яті комп'ютера в [[файл]] або передача по мережі потребує дотримання відповідностей про те, який з байтів є старшим, а який молодшим. Прямий запис [[Комірка пам'яті|комірок пам'яті]] призводить до можливих проблем при перенесенні додатку з платформи на платформу.
: <math>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.</math>

Набір цілих чисел <math>A_0,\dots,A_n</math> кожне з яких лежить в інтервалі від ''0 до 255'', є послідовністю [[Байт|байтів]], складових '''''M'''''. при цьому <math>A_0</math>називається ''молодшим байтом'', а <math>A_n</math> - ''старшим байтом ''числа '''''M'''''.
== Визначення порядку байтів ==
Порядок байтів в конкретній машині можна визначити за допомогою програми на мові Сі (testendian.c):
<syntaxhighlight lang="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;
}
</syntaxhighlight>
Вивід даної програми має сенс тільки на платформах, де розмір типу unsigned short більший, ніж розмір типу unsigned char. Це правильно на переважній більшості комп'ютерів, оскільки вони мають 8-розрядний байт. Однак існують і апаратні платформи, в яких розмір байта рівний розміру слова (або, в термінах мови C: <code>sizeof (char) == sizeof (int)</code>). Наприклад, в суперкомп'ютерах Cray.

Результати запуску на big-endian машині ([[SPARC]]):
<syntaxhighlight lang="text">
$ uname -m
sparc64
$ gcc -o testendian testendian.c
$ ./testendian
big-endian
</syntaxhighlight>
Результати запуску на little-endian машині (x86):
<syntaxhighlight lang="text">
$ uname -m
i386
$ gcc -o testendian testendian.c
$ ./testendian
little-endian
</syntaxhighlight>

== Дійсні числа ==
Зберігання [[Дійсні числа|дійсних чисел]] може залежати від порядку байт; так, на x86 використовуються формати [[IEEE 754]] зі знаком і порядком числа в старших байтах.

== Юнікод ==
Якщо [[Юнікод]] записаний у вигляді [[UTF-16]] або [[UTF-32]], то порядок байтів є суттєвим. Одним із способів позначення порядку байтів в юнікодових текстах є встановлення на початку спеціального символу [[Byte-order mark|BOM]] (byte-order mark), маркер послідовності байтів, U+FEFF — «перевернутий» варіант цього символу (U+FFFE) не існує і не допускається в текстах.

Символ U+FEFF зображується в UTF-16 послідовністю байтів <code>0xFE 0xFF</code> (big-endian) або <code>0xFF 0xFE</code> (little-endian), а в UTF-32&nbsp;— послідовністю <code>0x00 0x00 0xFE 0xFF</code> (big-endian) або <code>0xFF 0xFE 0x00 0x00</code> (little-endian).

== Конвертація ==
Для перетворення між мережним порядком байтів ({{lang-en|network byte order}}), який завжди у форматі big-endian, і порядком байтів, що використовується на машині ({{lang-en|host byte order}}), стандарт [[POSIX]] передбачає функції htonl (), htons (), ntohl (), ntohs ():
* <code>uint32_t htonl (uint32_t hostlong);</code>&nbsp;— конвертує 32-бітну беззнакову величину з локального порядку байтів в мережевій;
* <code>uint16_t htons (uint16_t hostshort);</code>&nbsp;— конвертує 16-бітну беззнакову величину з локального порядку байтів в мережевій;

* <code>uint32_t ntohl (uint32_t netlong);</code>&nbsp;— конвертує 32-бітну беззнакову величину з мережевого порядку байтів в локальний;
* <code>uint16_t ntohs (uint16_t netshort);</code>&nbsp;— конвертує 16-бітну беззнакову величину з мережевого порядку байтів в локальний.
У разі збігу поточного порядку байтів і мережевого, функції можуть бути «порожніми» (тобто, не змінювати порядку байтів). Стандарт також допускає, щоб ці функції були реалізовані макросами.

Існує багато мов і бібліотек із засобами конвертації в обидва основні порядку байт і навпаки.

[[Ядро Linux]]: le16_to_cpu (), cpu_to_be32 (), cpu_to_le16p (), і так далі;

Ядро [[FreeBSD]]: htobe16 (), le32toh (), і так далі;

[[Erlang]]:


<syntaxhighlight lang="erlang">
== '''ENDIANNESS''' ==
<<Count:32/big-unsigned-integer, Average:64/big-float>> = Chunk
'''ENDIANNESS''' — спосіб розташування байтів машинного слова в пам'яті в різних [[архітектура ЕОМ|архітектурах ЕОМ]].


Message = <<Length:32/little-unsigned-integer,
Певні історичні причини призвели до того, що сучасні ЕОМ можна розділити на два класи залежно від способу розміщення й адресації багатобайтових даних в пам'яті. В машинах із прямим розміщенням байт (big-endian) старший байт (big-end) слова зберігається за найменшою адресою, а в машинах зі зворотним розміщенням (little-endian) — за найбільшою. Тобто за найменшою адресою тут розміщується молодший байт (little-end).
MType:16/little-unsigned-integer, MessageBody>>
</syntaxhighlight>


[[Python]]:
«Велика війна» прихильників концепції little-endian ([[x86]], PDP, VAX) і big-endian (IBM S/370, більшість [[RISC]]-архітектур) приводить до непорозумінь в реалізації обміну інформацією між машинами з різних «таборів». Так, наприклад, при спробі прочитати звичайним чином слово «UNIX» на машині з іншим порядком розміщення, через цю розбіжність ми можемо одержати «NUXI» (якщо кожний символ представляється байтом, а слово складається із двох байтів). Тому проблему сумісності через розбіжність порядку проходження байт, називають часто «проблемою NUXI».


<syntaxhighlight lang="python">
В кожного зі способів можна знайти свої переваги й недоліки. При little-endian-розміщенні порядок проходження байтів збігається з порядком проходження адрес, що істотно спрощує алгоритми, пов'язані з обробкою «великих» чисел, робить природною роботу з рядками (перегляд рядка йде зліва направо). Big-endian-підхід може виявитися ефективнішим, наприклад, в задачі визначення знака числа, для чого досить прочитати тільки перше слово, яке містить знаковий розряд.
import struct
Count, Average = struct.unpack(">Ld", Chunk)
Message = struct.pack("<LH", Length, MType) + MessageBody
</syntaxhighlight>


[[Perl]]:
Втім, зараз аргументи на користь того або іншого способу виглядають сумнівними, і на перше місце встає проблема сумісності даних між різними архітектурами. Тому сучасні процесори забезпечуються засобами, що дозволяють працювати в обох режимах розміщення байтів.


<syntaxhighlight lang="perl">
== Цікаві факти ==
($Count, $Average) = unpack('L>d>', $Chunk);
[[Файл:Egg spiral egg cup.jpg|thumb]]
$Message = pack('(LS)<', $Length, $MType) . $MessageBody;
Терміни big-endian і little-endian запозичено у [[Джонатан Свіфт|Джонатана Свіфта]] з його сатиричного твору «[[Мандри Гуллівера]]», де описуються держави Ліліпутія і Блефуску, що вели між собою протягом багатьох років війни через розбіжності з приводу того, з якого кінця слід розбивати варені яйця («гостро-» і «тупоконечники» («little-» and «big-endians»)).
(або те ж саме: $Message = pack('Vv', $Length, $MType) . $MessageBody;)
</syntaxhighlight>
дані приклади для [[Erlang]], [[Python]], [[Perl]] містять ідентичну функціональність.


== Примітки ==
{{Без джерел|дата=липень 2008}}
{{reflist}}
{{Вікіфікувати|дата=липень 2008}}
{{Compu-stub}}


== Посилання ==
* http://encyclopedia2.thefreedictionary.com/byte+order
[[Категорія:Архітектура комп'ютера]]
[[Категорія:Архітектура комп'ютера]]
[[Категорія:Статті з прикладами коду мовою Perl]]
[[Категорія:Статті з прикладами коду мовою Erlang]]
[[Категорія:Статті з прикладами коду мовою Python]]
[[Категорія:Статті з прикладами коду мовою C]]
[[Категорія:Передавання даних]]

Поточна версія на 22:34, 17 січня 2024

Представлення даних у пам'яті комп'ютера

Порядок байтів (англ. 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»[1].

Такий порядок застосовується в 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-ковій системі числення.

Число: 0xA1B2C3D4
Представлення 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

Порівняння

[ред. | ред. код]
Розміщення байтів слова в пам'яті Big-endian— та Little-endian-машин

Істотною перевагою 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 (), і так далі;

Erlang:

 <<Count:32/big-unsigned-integer, Average:64/big-float>> = Chunk

 Message = <<Length:32/little-unsigned-integer,
        MType:16/little-unsigned-integer, MessageBody>>

Python:

 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 містять ідентичну функціональність.

Примітки

[ред. | ред. код]

Посилання

[ред. | ред. код]