Как работает кодирование Base64

Кодирование Base64 — это процесс преобразования двоичных данных в формат строки ASCII путем преобразования этих двоичных данных в 6-битное символьное представление. Метод кодирования Base64 используется, когда двоичные данные, такие как изображения или видео, передаются по системам, предназначенным для передачи данных в формате простого текста (ASCII).

Почему используется кодировка Base64?

Необходимость кодирования Base64 возникает из-за проблем, возникающих при передаче мультимедиа в необработанном двоичном формате в текстовые системы.

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

Один из способов кодирования этого вида двоичных данных таким образом, чтобы избежать таких проблем передачи, состоит в том, чтобы отправить их в виде простого текста ASCII в кодированном формате Base64. Это один из методов, используемых стандартом MIME для отправки данных, отличных от простого текста.

Многие языки программирования, такие как PHP и Javascript, включают функции кодирования и декодирования Base64 для интерпретации данных, передаваемых с использованием кодировки Base64.

Логика кодирования Base64

Кодировка Base64 разбивает двоичные данные на 6-битные сегменты по 3 полных байта и представляет их как печатные символы в стандарте ASCII. Это делается в два этапа.

Первый шаг — разбить двоичную строку на 6-битные блоки. Base64 использует только 6 битов (что соответствует 2 ^ 6 = 64 символа), чтобы обеспечить возможность печати закодированных данных и их удобочитаемости. Ни один из специальных символов, доступных в ASCII, не используется.

64 символа (отсюда и название Base64) — это 10 цифр, 26 строчных букв, 26 прописных букв, а также знак плюс (+) и косая черта (/). Существует также 65-й символ, известный как pad, который является знаком равенства (=). Этот символ используется, когда последний сегмент двоичных данных не содержит полных 6 битов.

Пример кодирования Base64

Например, возьмем три числа ASCII 155, 162 и 233. Эти три числа составляют двоичный поток 100110111010001011101001. Бинарный файл, как и изображение, содержит двоичный поток, работающий для десятков или сотен тысяч нулей и единиц.

Кодер Base64 начинает с разбивки двоичного потока на группы по шесть символов: 100110 111010 001011 101001. Каждая из этих группировок преобразуется в числа 38, 58, 11 и 41.

Бинарный поток из шести символов преобразует двоичный (или базовый-2) в десятичный (базовый-10) символ путем возведения в квадрат каждого значения, представленного 1 в двоичной последовательности с его позиционным квадратом. Начиная справа и двигаясь влево и начиная с нуля, значения в двоичном потоке представляют 2 ^ 0, затем 2 ^ 1, затем 2 ^ 2, затем 2 ^ 3, затем 2 ^ 4, затем 2 ^ 5.

Вот еще один способ взглянуть на это. Начиная слева, каждая позиция стоит 1, 2, 4, 8, 16 и 32. Если двоичное число имеет 1 в слоте, вы добавляете это значение; если в слоте 0, то нет. Двоичная строка 100110 преобразуется в десятичное число 38: 0 * 2 ^ 01 + 1 * 2 ^ 1 + 1 * 2 ^ 2 + 0 * 2 ^ 3 + 0 * 2 ^ 4 + 1 * 2 ^ 5 = 0 + 2 + 4 + 0 + 0 + 32.

Кодирование Base64 берет эту двоичную строку и разбивает ее на 6-битные значения 38, 58, 11 и 41.

Наконец, эти числа преобразуются в символы ASCII с использованием таблицы кодирования Base64. 6-битные значения этого примера переводятся в последовательность ASCII m6Lp.

Используя таблицу преобразования Base64:

  • 38 м
  • 58 — это 6
  • 11 л
  • 41 р

Этот двухэтапный процесс применяется ко всей двоичной строке, которая закодирована.

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

Вся цель кодирования Base64, от добавления заполнения для сохранения 3-байтовых двоичных сегментов до преобразования двоичного в текст с использованием таблицы Base64, заключается в сохранении целостности передаваемой двоичной информации.

Таблица кодирования Base64

В следующей таблице приведены все 64 символа, используемые в кодировке Base64.

Таблица кодирования Base64
СтоимостьголецСтоимостьголецСтоимостьголецСтоимостьголец
16Q32грамм48вес
1В17р33час49Икс
2С18S34я50Y
3D19T35J51Z
4Е20U36К52
5F21В37L531
6грамм22W38м542
7ЧАС23Икс39N553
8я24Y40о564
9J25Z41п575
10К2642Q586
11L27б43р597
12M28с44s608
13N29d45T619
14О30е46U62+
15п31е47v63/

Решая финал

В конце процесса кодирования может возникнуть проблема. Если размер исходных данных в байтах кратен трем, все работает нормально. Если это не так, могут быть пустые байты. Для правильного кодирования требуется ровно 3 байта двоичных данных.

Решение состоит в том, чтобы добавить достаточно байтов со значением 0 для создания 3-байтовой группы. Два таких значения добавляются, если для данных требуется один дополнительный байт данных, одно добавляется для двух дополнительных байтов.

Конечно, эти искусственные конечные 0 не могут быть закодированы с использованием таблицы кодирования ниже. Они должны быть представлены 65-м символом. Символ дополнения Base64 является знаком равенства (=) и помещается в конце кодированных данных.

Ссылка на основную публикацию