Base64 защищает двоичные данные от повреждения при передаче только в ASCII
Кодирование 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.
Значение | Char | Значение | Char | Значение | Char | Значение | Char | |||
А | 16 | Q | 32 | г | 48 | ш | ||||
1 | B | 17 | R | 33 | ч | 49 | X | |||
2 | С | 18 | S | 34 | я | 50 | у | |||
3 | D | 19 | T | 35 | J | 51 | г | |||
4 | Е | 20 | U | 36 | к | 52 | ||||
5 | F | 21 | В | 37 | L | 53 | 1 | |||
6 | G | 22 | W | 38 | т | 54 | 2 | |||
7 | Н | 23 | X | 39 | п | 55 | 3 | |||
8 | I | 24 | Y | 40 | о | 56 | 4 | |||
9 | J | 25 | Z | 41 | р | 57 | 5 | |||
10 | K | 26 | а | 42 | д | 58 | 6 | |||
11 | L | 27 | б | 43 | т | 59 | 7 | |||
12 | M | 28 | с | 44 | s | 60 | 8 | |||
13 | N | 29 | д | 45 | т | 61 | 9 | |||
14 | O | 30 | е | 46 | и | 62 | + | |||
15 | P | 31 | е | 47 | v | 63 | / |
Решая финал
В конце процесса кодирования может возникнуть проблема. Если размер исходных данных в байтах кратен трем, все работает нормально. Если это не так, могут быть пустые байты. Для правильного кодирования требуется ровно 3 байта двоичных данных.
Решение состоит в том, чтобы добавить достаточно байтов со значением 0 для создания 3-байтовой группы. Два таких значения добавляются, если для данных требуется один дополнительный байт данных, одно добавляется для двух дополнительных байтов.
Конечно, эти искусственные конечные 0 не могут быть закодированы с использованием таблицы кодирования ниже. Они должны быть представлены 65-м символом. Символ дополнения Base64 является знаком равенства (=) и помещается в конце кодированных данных.