Кодирование Base64 дает возможность для отправки всех типов данных через электронную почту в Интернете.
Если Интернет является информационной магистралью, то в случае с электронной почтой имеются ограничения. Через нее могут передаваться только небольшие данные.
Транспортная система электронной почты предназначена только для обычного ASCII текста. Попытка отправить текст на других языках или произвольные файлы - это как получить грузовик через овраг.
При попытке отправить текст на других языках или отправить случайный файл - это как попытаться проехать на большом грузовике через маленькое ущелье.
Так как же проехать на грузовике через это маленькое ущелье?
Мы должны разобрать наш грузовик на части и переправить эти части с одного конца на другой.
То же самое происходит, когда вы отправляете вложения по электронной почте. В процессе, известном как кодирование, двоичные данные преобразуются в текст ASCII, который можно без проблем транспортировать по электронной почте. В конце пути данные декодируются и мы получаем исходный файл.
Одним из методов кодирования данных в виде обычного текста ASCII является Base64.
Это один из способов, используемых стандартом MIME для отправки данных, отличных от обычного текста.
Base64 в помощь
Кодирование Base64 занимает три байта, каждый из которых состоит из восьми битов, и представляет их в виде четырех печатных символов в стандарте ASCII. По сути, делается это в два шага.
Первым шагом является преобразование трех байтов в четыре числа из шести бит. Каждый символ в стандарте ASCII состоит из семи битов. Base64 использует только 6 бит (что соответствует 2 ^ 6 = 64 символам), чтобы гарантировать, что закодированные данные могут быть пригодны для печати и читаемы «по-человечески».
Ни один из специальных символов, доступных в таблице ASCII, не используется. 64 символа (отсюда и название Base64) - это 10 цифр, 26 символов в нижнем регистре, 26 символов в верхнем регистре, а также символы «+» и «/».
Например, три байта равны 155, 162 и 233, соответствующий (и пугающий) поток битов равен 100110111010001011101001, который, в свою очередь, соответствует 6-битовым значениям 38, 58, 11 и 41.
Эти цифры преобразуются в символы из таблицы ASCII на втором шаге с использованием таблицы «Base64 encoding». 6-битные значения нашего примера преобразуются в последовательность ASCII «m6Lp».
- 155 -> 10011011
- 162 -> 10100010
- 233 -> 11101001
- 100110 -> 38
- 111010 -> 58
- 001011 -> 11
- 101001 -> 41
- 38 -> m
- 58 -> 6
- 11 -> L
- 41 -> p
Этот двухэтапный процесс применяется ко всей последовательности байтов, которые закодированы. Чтобы гарантировать, что закодированные данные могут быть правильно напечатаны и не превышают ограничения почтового сервера, символы новой строки добавляются так, чтобы общая длина строк не превышала 76 символов. Символы новой строки кодируются, как и все остальные данные.
Решение
В процессе кодирования мы можем столкнуться с проблемой. Если размер исходных данных в байтах кратен трем, все работает нормально. Если это не так, мы можем получить один или два 8-битных байта. Однако для правильного кодирования нам нужно ровно три байта.
Решение состоит в том, чтобы добавить достаточно байтов со значением «0» для создания 3-байтовой группы. Два таких значения добавляются, если у нас есть один дополнительный байт данных, один добавляется для двух дополнительных байтов.
Конечно, эти искусственные завершающие «0» не могут быть закодированы, используя таблицу кодирования ниже. Они должны быть представлены 65-м символом.
Отступом Base64 является «=». Естественно, он может появляться только в конце закодированных данных.
| Value | Char | Value | Char | Value | Char | Value | Char | |||
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | A | 16 | Q | 32 | g | 48 | w | |||
| 1 | B | 17 | R | 33 | h | 49 | x | |||
| 2 | C | 18 | S | 34 | i | 50 | y | |||
| 3 | D | 19 | T | 35 | j | 51 | z | |||
| 4 | E | 20 | U | 36 | k | 52 | 0 | |||
| 5 | F | 21 | V | 37 | l | 53 | 1 | |||
| 6 | G | 22 | W | 38 | m | 54 | 2 | |||
| 7 | H | 23 | X | 39 | n | 55 | 3 | |||
| 8 | I | 24 | Y | 40 | o | 56 | 4 | |||
| 9 | J | 25 | Z | 41 | p | 57 | 5 | |||
| 10 | K | 26 | a | 42 | q | 58 | 6 | |||
| 11 | L | 27 | b | 43 | r | 59 | 7 | |||
| 12 | M | 28 | c | 44 | s | 60 | 8 | |||
| 13 | N | 29 | d | 45 | t | 61 | 9 | |||
| 14 | O | 30 | e | 46 | u | 62 | + | |||
| 15 | P | 31 | f | 47 | v | 63 | / |