Base64 превращает группы из трёх байтов в четыре символа. Знак = заполняет последнюю группу, если байтов не хватает. Он не представляет букву исходного текста.
Считайте байты
Один оставшийся байт требует ==, два — =, три не требуют заполнения. f превращается в Zg==, fo в Zm8=, foo в Zm9v. Считайте байты UTF-8: русская буква или эмодзи могут занимать несколько байтов.
Восстановление пропущенного заполнения
После удаления пробельных символов остаток длины при делении на 4, равный 2, допускает добавление ==, а 3 — добавление =. Остаток 1 невозможен для полных данных Base64: дополнительные = не исправят его. Проверьте также алфавит и протокол.
Пропущенное и ошибочное заполнение
Decodex принимает Zg и Zg==, но отклоняет Zg= из-за неполного присутствующего заполнения. A=AA и Zg=== тоже отклоняются. Не удаляйте произвольные символы, скрывая повреждение данных. Одни протоколы требуют точного заполнения, другие его опускают.
Проверить пример
| Текст | UTF-8 bytes | Base64 | Заполнение |
|---|---|---|---|
f | 1 | Zg== | == |
fo | 2 | Zm8= | = |
foo | 3 | Zm9v | — |
Частые вопросы
Строка без = всегда неправильная?
Нет. Если число байтов кратно трём, заполнение не нужно. Некоторые протоколы также специально его опускают.
