Ускоренный курс по байтовому порядку.

Порядок байтов определяет способ организации байтов в памяти. В частности, он описывает последовательность появления байтов. Это ключевая концепция организации и структур памяти, и поэтому иногда она проникает в более общие программы более низкого уровня.

Сегодня я рассмотрю некоторые основы порядка байтов, сосредоточившись на порядках прямого и обратного порядка байтов. Лучше всего читать, имея базовые знания о двоичном, шестнадцатеричном и байтовом форматах.

Слова

Порядок байтов вращается вокруг слов. И нет, не те, что я сейчас печатаю, хотя они похожи. Эти слова, скорее, представляют собой группы байтов фиксированной длины.

Нас интересует порядок байтов в каждом из этих слов.

Почему слова имеют значение?

Слова - это ключевая организационная единица памяти. Разрядность процессора (32-разрядная, 64-разрядная) может указывать на стандартный размер слова (4 и 8 байтов соответственно), который он использует при организации памяти.

Поскольку память состоит из слов, порядок байтов слов может иметь общесистемные эффекты и принимать важные дизайнерские решения.

Порядок байтов

Endianness - это термин, используемый для обозначения порядка байтов в словах. Два наиболее распространенных вида байта: большой и маленький.

Значение байта

Основным фактором, определяющим порядок байтов, является значение, которое связано с местом байта в слове.

Давайте посмотрим, как значение работает с десятичными числами. Глядя на число 1337:

  • Цифра 1 в начале будет считаться самой значащей, так как ее место имеет наибольший вес (разряды тысяч).
  • 7 также является наименее значимым, так как его место имеет наименьший вес (единицы).

То же самое и с двоичными словами.

Глядя на 4-байтовое шестнадцатеричное число 54 63 65 20:

  • Байт 54 является самым значимым, поскольку его место имеет наибольший вес (2^24).
  • Байт 20 является наименее значимым, поскольку его позиция имеет наименьший вес (1).

Big Endian

Если слово имеет тип с прямым порядком байтов, первым идет старший байт, за ним идет второй и т. Д., Пока последний не будет наименее значимым.

Вот шестнадцатеричное слово 54636520 с прямым порядком байтов: 54636520 (то же самое).

Little Endian

Напротив, обратный порядок байтов подразумевает обратное: младший байт появляется первым, а самый старший - последним.

Вот 54636520 с прямым порядком байтов: 20656354.

Пример: применение байтового порядка к английскому языку

Давайте превратим английское предложение в его представления с прямым и обратным порядком байтов. Здесь мы будем следовать правилам английского языка, то есть слова могут быть сколь угодно длинными. Каждая буква (или знак препинания) соответствует одному байту.

Вот предложение с прямым порядком байтов:

The cow jumped over the moon.

И то же предложение, но с прямым порядком байтов:

ehT woc depmuj revo eht .noom

Как видите, порядок слов сохранен. С другой стороны, порядок букв в словах обратный.

Применение порядка байтов там, где он должен быть

Хорошо, время для грандиозного финала. Мы будем использовать то же предложение из предыдущего раздела, но вместо того, чтобы использовать буквы как байты, мы будем использовать фактические байты, представляющие каждый символ в предложении.

Вот это предложение вместе с его шестнадцатеричными значениями в байтах:

T  h  e     c  o  w     j  u  m  p  e  d     o 
54 68 65 20 63 6f 77 20 6a 75 6d 70 65 64 20 6f
v  e  r     t  h  e     m  o  o  n  .
76 65 72 20 74 68 65 20 6d 6f 6f 6e 2e 00 00 00

Обратите внимание, что, как и на компьютере, я добавил пустые байты заполнения в конце, чтобы общее количество байтов стало четным (делится на 4) 32. В противном случае последнее слово будет частичным, что может быть немного неудобно.

В отличие от английского, сейчас мы привязаны к компьютерным законам, что означает, что наши слова имеют фиксированную длину. Предположим, это 32-битные (4 байтовые) слова.

Это означает, что вместо красивых, хорошо расставленных английских слов, которые у нас были раньше, теперь у нас есть 8 уродливых слов, разделенных пробелами:

T  h  e        c  o  w
54 68 65 20    63 6f 77 20
j  u  m  p     e  d     o
6a 75 6d 70    65 64 20 6f
v  e  r        t  h  e
76 65 72 20    74 68 65 20
m  o  o  n     .
6d 6f 6f 6e    2e 00 00 00

Сможете ли вы угадать версию нашего нового предложения с прямым порядком байтов? То же, что и выше.

С другой стороны, прямой порядок байтов:

   e  h  T        w  o  c
20 65 68 54    20 77 6f 63
p  m  u  j     o     d  e
70 6d 75 6a    6f 20 64 65
   r  e  v        e  h  t
20 72 65 76    20 65 68 74
n  o  o  m              .
6e 6f 6f 6d    00 00 00 2e

ehT dnE

У меня тоже было искушение сделать конец каламбуром, но я уверен, что вы уже уловили.

Сегодня мы узнали, что порядок байтов определяет порядок байтов в словах. Если используется прямой порядок байтов, байты появляются в каждом слове как цифры в десятичном числе: от наибольшего веса к наименьшему. Напротив, если используется прямой порядок байтов, мы видим обратный порядок: от наименьшего веса к наибольшему значению.

Я надеюсь, что это была полезная основа для будущих махинаций, связанных с памятью. Спасибо за прочтение!