Как декодировать Base64
- Вставьте Base64 в поле Ввод · Base64. Переносы строк, пробелы, кавычки вокруг и префикс
data:...;base64,можно не убирать: декодер удалит их сам. - Декодированный текст появится в поле Результат · текст. Строка статуса сообщает Корректный Base64, вариант (Standard или Base64URL), число декодированных байтов, а в поле Похоже на показывает тип содержимого.
- Если текст искажён, смените Кодировку или выберите Автоопределение.
- Если внутри JSON, Форматировать JSON расставит отступы для удобного чтения.
- Нажмите Скопировать результат или Скачать, чтобы сохранить декодированные байты файлом. Расширение зависит от определённого типа, так что JSON сохраняется как
decoded.json, а PNG какdecoded.png.
Поменять местами отправляет декодированный текст обратно во ввод и переключает на кодирование. Так легко убедиться, что строка проходит туда и обратно без потерь.
Что принимает декодер
Base64 редко приходит чистым. Он бывает разбит по 76 символов из письма, взят в кавычки из JSON-файла, percent-кодирован из URL или лишён дополнения в токене. Декодер принимает всё это без каких-либо настроек:
| Вы вставляете | Вы получаете | Что произошло |
|---|---|---|
SGVsbG8gV29ybGQ | Hello World | Недостающий = восстановлен, строка статуса сообщает об этом |
8J-Riw | 👋 | URL-safe - и _ распознаны, вариант показан как Base64URL |
data:text/plain;base64,SGk= | Hi | Префикс data URI удалён |
"SGVsbG8=" | Hello | Кавычки из кода или JSON удалены |
SGVsbG8%3D | Hello | URL-кодированный %3D прочитан как = |
SGVs (перевод строки) bG8= | Hello | Переносы строк и пробелы пропущены |
К такой упаковке декодер снисходителен, а ко всему остальному строг. Символ вне алфавита его останавливает, ошибка называет символ и его позицию, и дальше декодер ничего не угадывает. Некоторые библиотеки поступают иначе: молча пропускают плохие символы и отдают испорченный результат (см. раздел с кодом ниже).
Для URL-safe токенов отдельно есть декодер Base64URL, который объясняет алфавит, а различия разобраны в статье Base64 и Base64URL.
Если в Base64 закодирован файл
Base64 переносит любые байты, и во многих строках Base64 лежат картинки или документы. Инструмент сверяет первые байты декодированных данных с известными сигнатурами файлов (magic numbers) и показывает итог в поле Похоже на: PNG, JPEG, PDF, ZIP, gzip, JSON, XML и многое другое. Для двоичных форматов он показывает печатный предпросмотр, сообщает, что данные двоичные, и даёт ссылку на нужный инструмент, например Base64 в картинку или Base64 в PDF. Скачать в любом случае сохраняет исходные байты.
Начало строки Base64 часто выдаёт формат ещё до декодирования:
| Base64 начинается с | Байты после декодирования | Формат |
|---|---|---|
iVBORw0KGgo | 89 50 4E 47 0D 0A 1A 0A | Изображение PNG |
/9j/ | FF D8 FF | Изображение JPEG |
JVBERi0 | %PDF- | Документ PDF |
UEsDBA | PK 03 04 | ZIP, а также DOCX и XLSX |
H4sI | 1F 8B 08 | Данные gzip (декодер Base64 + gzip) |
eyJ | {" | JSON, часто часть JWT |
PD94bWwg | <?xml | XML |
Больше сигнатур собрано в статье о частых префиксах Base64. Для файла неизвестного типа есть Base64 в файл: он определит формат и покажет предпросмотр.
Кодировки: как починить кракозябры
Base64 хранит байты и ничего не говорит о том, какая кодировка превратила символы в эти байты. Декодер предполагает UTF-8, и для большинства современных данных это верно. Когда нет, симптомы узнаваемы:
- Символы
�и пометка «Часть байтов не читается как UTF-8». Текст пришёл в устаревшей кодировке.Y2Fm6Q==читается какcaf�в UTF-8 и какcaféв ISO-8859-1 или Windows-1252. Русскому тексту вродеz/Do4uXyнужна Windows-1251, чтобы показатьПривет. - Точка или пропуск после каждой буквы. Это UTF-16, где за ASCII-буквами идёт нулевой байт.
SABlAGwAbABvAA==, например, даётHelloв UTF-16LE (Base64 в UTF-16). é,üили’в результате. Декодирование правильное: текст был закодирован дважды ещё до превращения в Base64 (байты UTF-8 прочитали как Latin-1 и снова сохранили в UTF-8).Y2Fmw4PCqQ==декодируется ровно вcafé. Исправлять нужно в источнике.
Автоопределение проверяет наличие метки порядка байтов, затем корректность UTF-8, затем шаблон нулевых байтов UTF-16. Однобайтовые кодовые страницы вроде Windows-1251 и KOI8-R для любого детектора выглядят одинаково, поэтому, если вы знаете источник, выбирайте их вручную.
Сообщения об ошибках и что они значат
| Сообщение | Обычная причина | Что делать |
|---|---|---|
| Недопустимый символ “.” в позиции 21 | Вставлен JWT целиком: точки разделяют три части | Декодируйте одну часть или используйте декодер JWT |
Недопустимый символ "\\" в позиции 8 | Base64 скопирован из JSON, где / экранирован как \/ | Замените \/ на / |
| Во входных данных смешаны символы стандартного (+ /) и URL-safe (- _) алфавитов | Склеены две строки или конвертация сделана наполовину | Приведите к одному алфавиту через Base64URL в Base64 |
| Дополнение (=) может стоять только в самом конце | Склеены два значения Base64, например SGk=SGk= | Разделите их и декодируйте по отдельности |
| Неверная длина: на один символ больше или меньше, чем нужно | При копировании потерялся или добавился символ | Скопируйте заново или попробуйте исправить Base64 |
Каждый случай подробнее разобран в руководстве по ошибкам Base64. Найти, в каком именно символе или в дополнении ошибка, поможет валидатор Base64.
Декодирование Base64 в JavaScript, Python и командной строке
atob() возвращает «двоичную строку» по символу на байт, поэтому для текста в UTF-8 нужен ещё шаг с TextDecoder. atob принимает строки без дополнения, но выбрасывает InvalidCharacterError на URL-safe - и _.
const s = "R3LDvMOfZSDwn5GL";
new TextDecoder().decode(Uint8Array.from(atob(s), c => c.charCodeAt(0)));
// "Grüße 👋"
// Node.js accepts both alphabets
Buffer.from(s, "base64").toString("utf8"); // "Grüße 👋"
Buffer.from("8J-Riw", "base64url").toString("utf8"); // "👋"
Python выбрасывает binascii.Error: Incorrect padding на входе без дополнения, так что допишите его сами:
import base64
s = "SGVsbG8"
base64.b64decode(s + "=" * (-len(s) % 4)).decode("utf-8")
# 'Hello'
base64.b64decode("SGVs*bG8=", validate=True)
# binascii.Error: Only base64 data is allowed
Без validate=True Python молча отбрасывает * и возвращает b'Hello'. Buffer.from в Node ведёт себя так же, так что повреждённая строка может декодироваться без всякой ошибки.
В командной строке:
printf '%s' 'R3LDvMOfZSDwn5GL' | base64 -d
base64 -d message.b64 > message.bin
Первая строка выводит Grüße 👋. В старых версиях macOS флаг пишется как -D. Подробнее по языкам: JavaScript, Node.js, Python, PHP.
Вопросы и ответы
Как декодировать строку Base64?
Вставьте её в поле ввода выше, и декодированный текст появится сразу. В коде декодируйте Base64 в байты, а затем прочитайте байты как UTF-8: base64.b64decode(s).decode() в Python, Buffer.from(s, "base64").toString() в Node.js.
Почему в декодированном тексте странные символы вроде � или é?
� означает, что байты не складываются в корректный UTF-8: текст, скорее всего, был в другой кодировке; попробуйте Windows-1252, Windows-1251 или UTF-16LE в меню «Кодировка». é вместо é значит, что текст был испорчен ещё до того, как его закодировали.
Можно ли декодировать Base64 без дополнения =?
Да. Декодер сам допишет недостающие = и сообщит об этом в строке статуса. Дополнение лишь заполняет последний блок, поэтому его всегда можно восстановить по длине.
На выходе абракадабра. Base64 испорчен?
Чаще это файл, а не текст. Посмотрите на поле «Похоже на» в строке статуса: для картинок, PDF, архивов и других двоичных форматов инструмент даёт ссылку на декодер, который покажет или сохранит файл.
Можно ли расшифровать Base64 без ключа?
Всегда. Base64 всего лишь кодировка с публичным алфавитом, никакой секретности она не даёт. Если декодированный результат по-прежнему выглядит случайным, данные зашифровали или сжали до кодирования.