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

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

И зачем вообще это нужно

Мы уже рассказывали, что кодирование и шифрование — два разных процесса. Кодирование делает данные удобными для восприятия компьютером или человеком. А шифрование защищает информацию, чтобы её не мог прочесть посторонний.

Сегодня у нас тема про один из типов кодирования — 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 для добавления в страницу картинок или других ресурсов без их прямого подключения с помощью тегов. Подпишитесь, чтобы не пропустить продолжение.

Обложка:

Алексей Сухов

Корректор:

Ирина Михеева

Вёрстка:

Кирилл Климентьев

Соцсети:

Юлия Зубарева

Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Вам может быть интересно
easy
[anycomment]
Exit mobile version