Base64 — стандарт кодирования двоичных данных при помощи только 64 символов ASCII. Алфавит кодирования содержит текстово-цифровые латинские символы A-Z, a-z и 0-9 (62 знака) и 2 дополнительных символа, зависящих от системы реализации. Каждые 3 исходных байта кодируются 4 символами (увеличение на ¹⁄₃).
Эта система широко используется в электронной почте для представления бинарных файлов в тексте письма (транспортное кодирование).
Метод кодирования Base64 относиться к группе binary-to-text encoding схем, которые преобразуют набор байтов в строковый ASCII формат.
Когда мы прикрепляем, например, картинку к письму, то картинка преобразуется в Base64 и добавляется к контенту письма. Таким же образом мы можем передавать вместе с текстом абсолютно любой файл.
На самом деле, все что делает алгоритм, это переводит набор битов в индексы заранее известной строки в 64 символа.
По стандарту RFC 4648 для кодирования используется следующая строка:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
{% hint style="info" %} Как можно заметить в строке не 64 символа, а 65. Последний символ нужен для обработки особых случаев {% endhint %}
Преобразование байтов в символы ASCII происходит итеративно, группами по 3 байта или 24 бита.
Если в выбранной группе, байтов меньше чем 3, тогда недостающие байты конвертируются в 65 символ.
Из трех восьмибитных групп выделяются четыре шестибитные группы. Далее битовые последовательности переводятся в десятичную систему счисления и получаются индексы. По полученным индексам выбираются символы из кодирующей строки и записывается результат.
- Base64 полезен там, где нужно отправлять небольшие бинарные данные вместе с текстовыми, например для сокращения http запросов за ресурсами;
- С помощью Base64 можно генерировать hash. Такая техника используется в webpack при генерации имен css классов или имен файлов;
- Base64 увеличивает размер файла. Например при применении алгоритма к png картинке весящей 1.9Mb на выходе получаем 2.5Mb (В среднем размер файла выростает на 25%);
- Base64 плохо подходит для кодирования встраиваемого текстового контента, например SVG, XML и т.д. При кодировании такого контента мы увеличиваем время на парсинг и ухудшаем эффективность сжатия.