Практическое руководство по Base64: биты, заполнение и проверка.

Просматривайте байты через шестибитные группы, вычисляйте размер вывода и отличайте канонический Base64 от устранимых проблем форматирования.

Base64 — это представление байтов с использованием ограниченного текстового алфавита. Это полезно, когда транспорт принимает текст, но полезные данные являются двоичными. Операция обратима: правильный декодер восстанавливает исходные байты, включая нули и значения, которые не являются допустимыми символами. Выбор того, как интерпретировать эти байты, — это отдельный шаг.

Три байта становятся четырьмя символами

Байт содержит восемь бит. Три байта содержат 24 бита, которые равномерно делятся на четыре группы по шесть штук. Каждая группа выбирает один из 64 символов алфавита. Стандартный алфавит содержит прописные и строчные буквы, цифры, плюс и косую черту. Для текста ASCII Man, байты 4d 61 6e в шестнадцатеричном формате, а закодированный вывод имеет вид TWFu.

Input bytes:  01001101 01100001 01101110
Six-bit sets: 010011 010110 000101 101110
Indexes:      19     22     5      46
Output:       T      W      F      u

Заполнение описывает последнюю группу

Когда остается один байт, выходные данные содержат два символа алфавита и два знака равенства. Два оставшихся байта образуют три символа алфавита и один знак равенства. Таким образом M становится TQ==, в то время как Ma становится TWE=. Дополнение является частью структуры: добавление случайных знаков равенства не восстанавливает потерянный символ данных. При каноническом кодировании неиспользуемые биты последнего символа алфавита также должны быть равны нулю.

Для n входных байтов вывод с дополнением содержит 4 × ceil(n / 3) символов. Поэтому файл размером 1024 байта преобразуется в 1368 символов до добавления префикса Data URI или переносов строк. Base64 не сжимает данные, хотя отдельный слой сжатия при передаче может уменьшить конечный объём.

Проверьте перед интерпретацией

Используйте строгий режим при тестировании производителя по определенному протоколу. Используйте режим совместимости, если известный источник вставил разрывы строк ASCII, пропустил заполнение или включил оболочку Data URI. Просмотрите записанные корректировки. Неожиданная пунктуация, смешанные алфавиты и ненулевые неиспользуемые биты заслуживают расследования, а не молчаливого удаления.

Наконец, проверьте декодированные байты. Действительный Base64 может содержать недопустимую последовательность UTF-8, усеченное изображение или неполный PDF. Успешное декодирование подтверждает только уровень кодирования. Сохраните двоичные результаты в виде байтов и используйте соответствующий парсер файлов для проверки их структуры. Правила алфавита, заполнения и канонических битов указаны в RFC 4648.