Статьи

База Что? Практическое введение в базовое кодирование

В молодом возрасте мы учимся считать по пальцам — начиная с 1-5, затем 1-10, и, возможно, если вы особенно предприимчивы в детстве, вы научитесь считать до 20, 30 и выше. , Никто никогда не пытается просветить нас, что мы на самом деле делаем более сложные математические предположения; мы все знаем Base10, если быть точным.

В этой статье мы начнем с более глубокого понимания Base10 и его структуры, а затем обсудим двоичный файл (Base2, строительные блоки вычислений). Наконец, мы закончим, поговорив о Base32 и Base64. На каждом этапе мы обсудим преимущества и использование для каждого типа.


У нас 10 пальцев.

Итак, почему мы выбрали Base10? Это не потому, что существуют буквы 0-9; это было фактически результатом выбора использовать Base10. На самом деле, это, скорее всего, из-за процесса обучения, который мы решили выше — у нас есть 10 пальцев. Это значительно облегчает понимание системы.

Итак, давайте немного поговорим о том, как Base10 на самом деле структурирован. Это будет основой понимания, которое мы будем использовать в последующем обсуждении.

Начиная с 0, мы считаем до 9, заполняя столбец «1». После того, как столбец единиц заполнен (имеет 9), это максимум для столбца. Таким образом, мы переходим к следующему столбцу (слева) и начинаем с 1. Для всех намерений и целей мы можем постулировать, что перед нашим первым значимым столбцом находится бесконечное число ведущих нулей. Другими словами, «000008» совпадает с «8». Таким образом, когда каждый столбец заполняется, следующий столбец увеличивается на единицу, и мы возвращаемся к предыдущему столбцу, чтобы заполнить его снова так же, как и раньше. В частности, столбец 1 с увеличивается с 0 до 9, а затем еще десять добавляется к столбцу десятков. Это продолжается, и если столбец десятков находится на 9, а столбец 1s на 9, 1 добавляется к столбцу 100 и так далее. Мы все знаем этот кусок пизла.

Рассмотрим число 1020. Начиная справа, мы можем понимать это как «0 * 1 + 2 * 10 + 0 * 100 + 1 * 1000». Теперь рассмотрим число 5 378. Мы можем понимать это как «8 * 1 + 7 * 10 + 3 * 100 + 5 * 1000». Таким образом, обобщенная функция для понимания Base10 выглядит следующим образом:

(10 raised to the power of the column from the right -1) * (the number found in the column)

Поэтому, если есть 6 в 5-м столбце справа, 10 ^ 4 * 6 = 60 000.

Мы видим, что это обобщаемая формула для понимания всех базовых систем.


Вот почему эти системы называются Base (N).

Следующая система, о которой мы поговорим, — Base2, или двоичная. Двоичный код состоит из двух цифр, 0 и 1. Это хорошо подходит для вычислений по многим причинам, в основном потому, что компьютеры полагаются на коммутаторы, которые имеют два состояния: включено или выключено. Двоичная система — это самая базовая система, необходимая для всех логических операций (подумайте «истина» и «ложь»).

Итак, как работает бинарный файл? Возьмите формулу сверху и вместо десяти используйте две. И на этом примечании, именно поэтому эти системы называются Base (N).

(2, поднятые в степень столбца справа -1) * (число, найденное в столбце)

Итак, давайте возьмем произвольное число 1001101 в двоичном виде и применим эту формулу.

(1 * 1) + (0 * 2) + (1*4) + (1 * 8) + (16 * 0) + (32 * 0) + (64 * 1) = 77

«Подождите!», Вы думаете. «Если двоичные файлы — это все, из чего сделаны компьютеры, как бы вы писали буквы в двоичном формате?» Хороший вопрос. Это фактически подводит нас к нашему представлению Base16.


Вместо этого было бы однозначное представление 10.

Давайте на минутку представим, что у нас было 11 пальцев. Естественно, мы использовали бы систему Base11. Помимо того, что в настоящее время это трудно представить, какие еще последствия это может иметь? Возможно, наиболее важный вывод заключается в том, что у нас был бы другой прирост, превышающий 9 в столбце 1 с. Но это не будет «10», потому что 10 не ограничивается столбцом 1 с. Вместо этого это будет однозначное представление числа 10. И, собственно, именно так функционируют буквы в базовых системах от Base10 до Base62 с некоторыми оговорками (о которых мы поговорим позже, когда будем говорить о Base32).

Давайте представим, что используем Base11, но заменим заглавную букву A на цифру «10», которую мы обсуждали выше. Как бы мы написали число 54?

Поскольку мы знаем, что первый столбец слева — это столбец «11», мы начнем с деления 54 на одиннадцать, что дает нам 4 с остатком 10. Если «A» представляет 10, в Base11 число 54 будет представлено как 4А.

Давайте сделаем это наоборот, с формулой, которую мы использовали ранее.

(11 raised to the power of the column from the right - 1) * (the number found in the column)

В этом случае это будет означать:

(1 * A) + (4 * 11)

Теперь замените 10 на A:

(1*10) + (4*11) = 54

Чем это полезно, вам интересно? Base11 не обязательно может быть полезен (если у вас нет какой-то структуры данных, которая выиграет от системы Base11). Однако Base16 используется во всех компьютерных системах для нескольких целей. Base16, также известный как шестнадцатеричный, использует числа 0-9, за которыми следуют буквы af (без учета регистра). В частности, вы увидите шестнадцатеричные числа, используемые для определения цветов RGB в CSS (и в большинстве виджетов палитры цветов в настольном программном обеспечении), с двумя цифрами для каждого из каналов — красного, зеленого и синего.

Так, например, #A79104 будет производить r = A7, g = 91, b = 04 . В десятичных числах это будет эквивалентно r = 167, g = 145, b = 4 ; результирующий цвет будет золотисто-желтым. Две шестнадцатеричные цифры, взятые вместе, могут представлять 256 различных чисел, и, таким образом, в шестнадцатеричной системе RGB возможно 256 ^ 3 (16,777,216) возможных комбинаций чисел, представленных всего 6 символами (или 3, если вы используете метод ярлыков, где каждая из трех цифр неявно удваивается, например #37d == #3377dd ).

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

Примечание: То же самое в целом верно для популярности Base32 и Base64; эти кодировки используются потому, что они естественно лучше для двоичных данных (потому что они имеют степень 2), и потому что есть, по крайней мере, 64 безопасных символа (и не 128 безопасных символов) почти на каждом компьютере.

Для шестнадцатеричного примера возьмите число 1100 в шестнадцатеричном формате, что эквивалентно 4352 в десятичном виде. То же число в двоичном виде — 0001 0001 0000 0000. Преобразование из шестнадцатеричного в двоичное является простой операцией использования таблицы преобразования, где 0 в шестнадцатеричном виде равно 0000 в двоичном, а F в шестнадцатеричном — 1111 в двоичном.

Обратите внимание, что 0 слева от первого числа означает, что двоичное число находится в битах, а 0 слева — просто пустые столбцы. По сути, они не нужны; однако вы встретите двоичный код, написанный таким образом, почти исключительно. Эта практика называется заполнением, и практикуется потому, что длина данных неизвестна, и, следовательно, может вызвать проблемы, когда происходит многократная передача данных; при заполнении последней строки гарантируется, что размер данных будет, например, 4 бита длинным (для двоичного кода). Заполнение также происходит в других обычно используемых и основанных на спецификациях схемах кодирования; в частности, Base32 и Base64 оба используют знак равенства («=») для заполнения.


Можно предположить, что Base32 — это числа 0-9, а затем первые 22 буквы алфавита (до V).

Помните, когда мы упоминали оговорку выше? Это предостережение: наиболее распространенное определение Base32 на самом деле является кодировкой, которая начинается с первых 26 букв алфавита и заканчивается цифрами 2-7. Это определено в Запросе комментариев к Интернету (RCFC) 4648 , который также определяет Base16 и Base64. Обратите внимание, разница состоит в том, что кодировка для 0 — это A, а не 0. Чтобы кодировать строку в Base32, выполняются следующие инструкции.

Сначала кодируемая строка разбивается на 5-байтовые блоки (40 бит в двоичном виде). Буквы представлены 8-битными блоками в ASCII (стандарт для компьютеров), поэтому на каждые 5 букв приходится 40 бит. (Это 8-битное определение для каждой буквы позволяет в общей сложности 255 символов в ASCII.)

Затем разделите эти 40 битов на 8 пятибитных блоков; Итак, на каждые 5 букв приходится 8 блоков для кодирования в base32. Сопоставьте каждый из этих блоков с 5-битным сопоставлением символов в алфавите Base32. Например, если пятибитный блок равен 00010 (или десятичному 2), отображаемым символом является буква c . Если пятибитный блок равен 01010 (десятичное 10), отображаемым символом является буква K.

Давайте применим эти шаги к строке «yessir».

символ ASCII десятичный 8-разрядный двоичный код ASCII
Y 89 01111001
е 101 01100101
s 115 01110011
s 115 01110011
я 105 01101001
р 114 01110010

Давайте теперь возьмем двоичные представления и объединим их, разделив на 5-битные группы.

1
2
01111 00101 10010 10111 00110 11100 11011 01001
01110 010(00) null null null null null null

Примечание к вышесказанному: поскольку спецификация определяет, что кодирование должно выполняться в виде фрагментов из 8 5-битных фрагментов, мы должны дополнить 0, если количество бит не делится на 5 (следовательно, 010 (00) на вторая строка) и с =, если количество чанков не делится на 8. Значения «null» будут заменены символом заполнения «=».

Каждое из этих 5-битных двоичных чисел отображается на символ в 32-битном алфавите; в частности, вывод для yessir будет PFSXG43JOI======

Аналогичный процесс применяется для Base64. Есть несколько принципиальных отличий между Base32 и Base64. Base64 содержит буквы AZ, az, цифры 0-9 и символы + и /. Как упоминалось ранее, символ «=» используется для заполнения. Различия состоят главным образом в том, что все буквы чувствительны к регистру, и используются все цифры (вместо подмножества 2-7). Символы + и / также добавляются.

Процесс кодирования Base64 берет 24-битные строки (3 буквы) и разбивает их на четыре 6-битных блока, отображая полученное двоичное число в алфавит Base64. Итак, давайте посмотрим на наш предыдущий пример, строку «yessir».

1
2
3
8-bit binary: 01111001 01100101 01110011 01110011 01101001 01110010
6-bit chunks: 011110 010110 010101 110011 011100 110110 100101 110010
Base64: eWVzc2ly

Есть несколько важных вещей, на которые стоит обратить внимание. Во-первых, Base64 чувствителен к регистру. Во-вторых, поскольку число битов (48) делилось на 6, добавление битов не требовалось. Количество 6-битных блоков также делилось на четыре (что также означает, что количество входных символов делилось на 3), поэтому заполнение нулями («=») также не требовалось.


Эти бинарные дружественные основы используются в структурах программирования.

Эти бинарные дружественные основы используются в структурах программирования. Двоичные данные кодируются в этих базах для обеспечения точности передачи и защиты от ошибок, которые могут возникнуть в результате случайной некодированной передачи двоичных данных. Они опираются на основанные на стандартах таблицы символов и гарантированно будут работать, только если кодер и декодер используют одну и ту же таблицу; например, существуют общепринятые модифицированные версии base32, включая версию Дугласа Крокфорда, которая изменяет некоторые допустимые символы, включая букву «u», чтобы избежать непреднамеренного непристойного отношения.


В дополнение к использованию шестнадцатеричных чисел на регулярной основе для цветов CSS, Base32 и Base64 используются в сети постоянно. Хотя официальный процесс кодирования для Base32 и Base64 увеличивает размер строки, кодирование чисел в Base64 или Base32 может быть очень полезным для таких вещей, как сокращение URL, когда URL может указывать на / foo / id. Рассмотрим следующие десятичные числа и их эквиваленты Base32 и Base64.

Десятичная дробь Base16 base32
20 U U
50 бс Y
+967 6h PH
745619 WYET C2CT
7241930 G5AGK boDK
798312345192 xhpr7lti LnfH65o

Как видите, использование Base64 или Base32 для сокращения номера имеет существенные преимущества. Когда каждый символ считается, использование этих базовых кодировок позволяет вам сохранять символы. Во многих случаях кодированное число составляет примерно половину длины некодированного числа.


Какие другие типы веб-приложений вы найдете для этих кодировок?

Если вы Base64 кодируете число 959, результат будет O /. Конечно, это не безопасное для URL значение из-за «/», поэтому URL, указывающий на O /, будет декодироваться не как O /, а как O (что является десятичным значением 14). Также было бы отказано в том, чтобы закодировать символ «/» как эквивалент кода ASCII (% 47%), поскольку это значительно удлиняет URL. Два основных решения появились для борьбы с этой проблемой. Одним из них является URL-безопасный вариант Base64, который заменяет + и / на — и _ соответственно. Также удаляется спецификация добавления символов = для заполнения. Другой вариант — перейти к кодировке Base62, которая сохраняет почти все преимущества Base64 и удаляет + и /. Однако кодирование Base62 не так легко применимо, как двоичный заменитель передачи, и, следовательно, оно гораздо менее популярно.


Вот и все! Теперь у вас есть фундаментальные знания о базовых системах, особенно в том, что касается применения для кодирования двоичных данных. Какие другие типы веб-приложений вы найдете для этих кодировок?