Мы уже рассказывали, что кодирование и шифрование — два разных процесса. Кодирование делает данные удобными для восприятия компьютером или человеком. А шифрование защищает информацию, чтобы её не мог прочесть посторонний.
Сегодня у нас тема про один из типов кодирования — Base64: что это за технология, как работает и насколько полезна.
Символы ASCII
Кодирование Base64 работает с символами (characters) ASCII, поэтому сначала про них.
ASCII — это специальная таблица, которую компьютер использует для вывода символов на экран.. ASCII расшифровывается как Американский стандартный код для обменаинформацией (American Standard Code for Information Interchange). В таблицу входят символы латинского алфавита, цифры и управляющие символы.
Всего в ASCII 128 символов. Каждый из них представлен 7 битами — последовательностью нулей и единиц. Первый символ имеет последовательность 000 0000, а последний — 111 1111.
Управляющие символы отвечают за действия в программах: перенос строки, удаление символа, вызов звукового сигнала.
Например, есть такие управляющие символы:
BEL
(Bell, номер 7 в таблице). Обозначает «Звонок». Вызывает звуковой сигнал на устройстве, сейчас уже почти не используется.BS
(Backspace, номер 8 в таблице). Удаление или «Назад». Удаляет последний символ, двигая курсор на одну позицию назад.LF
(Line Feed, номер 10 в таблице). Обозначает «Перевод строки». Переносит курсор на следующую строку.
Работает это так:
- Пользователь нажимает Enter на клавиатуре.
- Клавиатура отправляет сигнал, связанный с клавишей Enter.
- В зависимости от операционной системы сигнал трансформируется в нужный управляющий символ. На macOS и Linux это будет LF, а на Windows — комбинация
CR
иLF
. - В результате компьютер понимает, что нужно сделать, и выполняет это.
Что такое Base64
Если ASCII нужен для вывода текста на экран, то Base64 использует символы этой таблицы для удобной передачи файлов разного формата, переводя их в формат текстовых символов.
Зачем это нужно: некоторые каналы связи доступны только для символов ASCII, хотя используются для обмена файлами любого формата. Чтобы передавать нетекстовые файлы, их переводят в последовательность текстовых символов через Base64.
Base64 — это преобразователь любых файлов на компьютере в текстовую строку. Например, на одном компьютере мы переводим изображение в текст, передаём это изображение по текстовому каналу связи на второй компьютер и восстанавливаем на этом компьютере исходное изображение.
Например, HTML — текстовый формат, и напрямую добавить в него картинки и видео нельзя: нужно встраивать ссылки, вставлять через свойства в стилях или вообще использовать векторный SVG-формат. Base64 позволяет использовать в передаче любые файлы в виде текста, кодируя их через 64 символа таблицы ASCII.
Таблица используемых в кодировке символов включает прописные и строчные буквы латинского алфавита, цифры, знак «=» и два управляющих символа:

Как работает кодирование Base64
Base64 переводит файлы в текстовый формат, используя 64 символа из ASCII. Давайте посмотрим, как проходит этот процесс, начиная с входного файла и заканчивая переводом в символы.
Входной файл может быть любым. Текст, изображение, музыка — для компьютера всё это состоит из последовательности нулей и единиц. Когда говорят про кодировку Base64, обычно всё кроме текста называют binary data или binary file, то есть двоичными данными.
Перевод в байтовый вид. Данные переводятся в группы по 8 бит, чтобы дальше с ними можно было работать по одному алгоритму. Мы разберём два примера такого преобразования: слово из символов ASCII и изображение. В качестве слова возьмём cat
, строчными буквами.
Слово cat
состоит из 3 букв. Каждой из них в ASCII-таблице соответствует номер от 0 до 127: c
— 99, a
— 97, t
— 116. Эти номера в байтовом виде будут представлять собой последовательности из 8 нулей и единиц:
- 99 → 0110 0011
- 97 → 0110 0001
- 116 → 0111 0100
В итоге получается строка из 3 байтов, или 24 двоичных символов:
"cat" → 01100011 01100001 01110100
Изображение изначально состоит из байтов, то есть таких же последовательностей из 8 нулей и единиц. Количество байтов может быть разным, это зависит от изображения.
Перевод в 64-битный вид. Данные из групп по 8 бит переводятся в группы по 6 бит, потому что 2⁶ = 64, именно столько символов и составляет целевая ASCII-таблица, которая будет использоваться для кодирования.
Например, слово cat состояло из 3 групп по 8 бит:
01100011 01100001 01110100
А стало — из 4 групп по 6 бит:
011000 110110 000101 110100
Проблемы с вводом, не кратным 3. С примером из слова cat
всё просто: у нас есть 3 байта, то есть 24 символа. 24 можно представить группами по 6 байтов, потому что 24 делится на 6 без остатка. Но в других словах и файлах количество байтов может быть не кратно 3. Тогда биты не делятся нацело на группы по 6. Для этого в Base64 существует знак равенства.
На практике мы просто добавляем нужное количество пустых байтов для кратности 3. Например, последовательность из одного байта:
01100011
Мы расширяем её до 3, добавляя в конец два пустых:
01100011 00000000 00000000
На следующих этапах эти байты превратятся не в символ «A», а в символ «=», потому что компьютер запомнит, что количество исходных данных изначально не было равно 3.
Переводим последовательности по 6 бит в десятичное число. Каждая 6-битная группа обозначает номер от 0 до 63. Подставляем:
- 011000 → 24
- 110110 → 54
- 000101 → 5
- 110100 → 52
Каждому номеру в Base64 соответствует определённый символ:
- 24 → Y
- 54 → 2
- 5 → F
- 52 → 0
На этом этапе происходит кое-что очень важное: каждый символ сохраняется как отдельный байт. Поэтому, хотя в изначальной последовательности у нас было 4 группы по 6 бит, сейчас у нас 4 группы по 8 бит. А это значит, что файл стал занимать больше памяти.
Соединяем символы и получаем итоговый результат кодирования:
cat → Y2F0
Вот как будет выглядеть кодирование фразы с использованием латинского алфавита, если брать по 3 символа и переводить их в блоки по 4 символа из Base64. Можно увидеть шаги трансформации на каждом этапе — например, bytes в формате ASCII и Base64:

Зачем нужен Base64
Эта кодировка помогает передавать данные по разным каналам, включая те, которые предусматривают только передачу текстовых символов.
Двоичный файл — то есть любой файл — можно легко передать через электронную почту или веб-страницы, не повредив сами файлы. Поэтому Base64 работает как универсальный язык между разными платформами.
Когда использовать Base64
Главный сценарий использования Base64 — когда по сети передаются данные, для которых эти каналы не предназначены.
Например, одной из причин появления Base64 была передача изображений в текстовых сообщениях по электронной почте.
Другой пример — иногда в текстовые форматы JSON, XML или HTML нужно встроить нетекстовые данные. Это будет выглядеть просто как дополнительные строки кода.
Преимущества и недостатки использования Base64
Что хорошо:
- Все бинарные данные можно передавать через текстовые системы.
- Кодировку можно использовать в специальных форматах, которых используются в программировании: URL, JSON, XML. В них недопустимы бинарные файлы, отличные от текста, а некоторые символы могут сломать структуру.
- Base64 добавляет надёжности. Можно быть уверенным, что данные не будут повреждены из-за использования неподдерживаемых символов.
А что не очень:
- На кодирование и декодирование нужны время и дополнительные ресурсы.
- Представление, или representation, файла во время кодировки увеличивается. Из-за того, что группы по 6 бит преобразуются в группы по 8 бит, размер файла увеличивается примерно на 33%.
Примеры применения Base64
Вот два примера, где сегодня может использоваться Base64.
Веб-разработка: Base64 часто используется для встраивания небольших изображений, аудиофайлов или шрифтов в HTML, CSS или JSON. Это называется инлайн-ресурсами: они добавляются текстом в линию кода. Ещё такую кодировку используют в HTTP-запросах, потому что некоторые символы в запросах могут не поддерживаться — а символы ASCII подходят.
Электронная почта: Base64 помогает представить данные в удобном виде для передачи через почтовые серверы. Даже если с каналом будет что-то не в порядке, кодировка поможет передать все вложения в исходном виде.
Ограничения и соображения при использовании Base64
При использовании кодировки стоит учитывать несколько вещей.
- Нужно следить за допустимыми объёмами файлов и пределами трафика — Base64 на треть увеличивает размер файла, поэтому это может повлиять на работу других систем.
- Формат Base64 не так эффективен, как современные технологии передачи бинарных файлов. Если можно воспользоваться более продвинутыми технологиями, лучше использовать их.
- Кодировка — не шифрование. Данные легко декодировать, поэтому этот инструмент нельзя использовать для защиты данных.
Как декодировать Base64
Закодировать и декодировать информацию можно несколькими способами.
Веб-инструменты. Текстовые данные разных форматов можно кодировать и декодировать онлайн. Один из сервисов для этого — www.Base64decode.org. Команды преобразования и расшифровки будут называться похоже на Decoding, Encoding или Convert:

В большинстве языков программирования есть встроенные инструменты для работы с кодировкой Base64.
Пример на Python:
# импортируем модуль работы с кодировкой
import Base64
# создаём объект-string с закодированной строкой
encoded_data = "0JbRg9GA0L3QsNC7INCa0J7QlA=="
# создаём объект с декодированным текстом
text = Base64.b64decode(encoded_data).decode('utf-8')
# выводим результат на экран
print(text)
После запуска кода декодированная строка будет выведена в консоли:
Журнал КОД
Кодировать и декодировать строки можно также в командной строке. Вот как это работает на macOS:

Что дальше
В следующий раз мы сделаем веб-проект, в котором будем использовать Base64 для добавления в страницу картинок или других ресурсов без их прямого подключения с помощью тегов. Подпишитесь, чтобы не пропустить продолжение.