Как работает Base64

Pavel Bely
2 min readMay 26, 2019

--

Метод кодирования Base64 относиться к группе binary-to-text encoding схем, которые преобразуют набор байтов в строковый ASCII формат.

Вы могли встречаться с Base64 при изучении писем электронной почты. Когда мы прикрепляем, например, картинку к письму, то картинка преобразуется в Base64 и добавляется к контенту письма. Таким же образом мы можем передавать вместе с текстом абсолютно любой файл!

Алгоритм

Давайте попробуем разобраться, как алгоритм Base64 работает. На самом деле, все что делает алгоритм, это переводит набор битов в индексы заранее известной строки в 64 символа.

По стандарту RFC 4648 для кодирования используется следующая строка:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=

Как можно заметить в строке не 64 символа, а 65. Последний символ нужен для обработки особых случаев, о которых поговорим далее.

Преобразование байтов в символы ASCII происходит итеративно, группами по 3 байта или 24 бита.

Если в выбранной группе, байтов меньше чем 3, тогда недостающие байты конвертируются в 65 символ.

Из трех восьмибитных групп выделяются четыре шестибитные группы. Далее битовые последовательности переводятся в десятичную систему счисления и получаются индексы. По полученным индексам выбираются символы из кодирующей строки и записывается результат.

Подробное описание Base64 находится в спецификации RFC 4648

Реализуем base64

Давайте попробуем реализовать описанный выше алгоритм на JavaScript.

В интернете довольно много разных реализаций Base64, мне понравилась реализация алгоритма на сайте webtoolkit, там же можно найти реализацию decode.

Самым сложным местом алгоритма являются битовые операции. Для описания того, что происходит в строке, я оставил комментарий выше.

Применение

  • Base64 полезен там, где нужно отправлять небольшие бинарные данные вместе с текстовыми, например для сокращения http запросов за ресурсами;
  • С помощью Base64 можно генерировать hash. Такая техника используется в webpack при генерации имен css классов или имен файлов;
  • Base64 увеличивает размер файла. Например при применении алгоритма к png картинке весящей 1.9Mb на выходе получаем 2.5Mb (В среднем размер файла выростает на 25%);
  • Base64 плохо подходит для кодирования встраиваемого текстового контента, например SVG, XML и т.д. При кодировании такого контента мы увеличиваем время на парсинг и ухудшаем эффективность сжатия.

--

--