Как исправить строку Base64
- Вставьте повреждённое значение в поле Base64 для проверки. Не убирайте окружающие кавычки, префиксы и переносы строк: по ним инструмент понимает, что произошло.
- Выберите Формат результата: стандартный с дополнением, стандартный без дополнения, URL-safe с дополнением или без, MIME (строки по 76 символов, CRLF) или PEM (строки по 64 символа).
- Посмотрите блок Что исправлено. Каждая правка указана отдельно, так что безобидную чистку легко отличить от изменений, которые могли стоить данных.
- Скопируйте или скачайте результат, нажмите Проверить результат, чтобы полностью его проверить, или Скачать декодированный файл, чтобы сохранить байты.
Что исправляет инструмент
| Что вставили | Что произошло | Исправлено |
|---|---|---|
"SGVsbG8gd29ybGQ\u003d" | JSON-строка с экранированным = | SGVsbG8gd29ybGQ= |
SGVsbG8%3D | percent-кодирование в URL | SGVsbG8= |
PDw/Pz8 Pg== | + превратился в пробел в query-строке | PDw/Pz8+Pg== |
PDw_Pz8-Pg | URL-safe без дополнения | PDw/Pz8+Pg== |
SGVsbG8gd29ybGQ | дополнение срезано | SGVsbG8gd29ybGQ= |
SGVsbG8=V29ybGQ= | два значения склеены | SGVsbG9Xb3JsZA== (HelloWorld) |
SGVsbG9= | ненулевые неиспользуемые биты | SGVsbG8= |
Authorization: Basic … | скопировано вместе с именем заголовка | только токен |
Кроме того, инструмент убирает префиксы data:…;base64, и строки PEM -----BEGIN …-----, снимает простые кавычки, превращает буквальные \n и \/ обратно в символы (PHP json_encode по умолчанию пишет \/), удаляет пробелы и переносы строк, приводит смешанные алфавиты +/ и -_ к одному и исправляет число =.
При склейке каждый кусок декодируется отдельно, а байты затем соединяются. Это правильно, когда программа дописывала куски с дополнением один за другим. Если просто удалить = внутри строки, все последующие биты сдвинутся и получится мусор.
Правки, за которыми может скрываться настоящая проблема
Две правки выводятся как предупреждения, потому что это догадки:
- Удалены недопустимые символы. Если в строке были
*,#или случайный символ Unicode, инструмент удаляет их и показывает, какие именно. Символ посреди данных мог быть настоящим знаком, который исказился, и тогда декодированные байты начиная с этого места всё равно будут неверными. - Отброшен лишний символ. Длину с остатком 1 не выдаёт ни один кодировщик, значит, либо один символ лишний, либо строка обрезана. Инструмент отбрасывает последний символ, чтобы остальное декодировалось, но если значение было обрезано, конец файла потерян. У обрезанной картинки обычно серый или пустой низ, а обрезанный ZIP не откроется.
Если появилось одно из этих предупреждений, постарайтесь заново получить оригинал: необрезанную строку лога, полный ответ API или вложение прямо с почтового сервера.
Почему наивного исправления мало
Популярный сниппет для «починки» Base64 справляется с пробелами, URL-safe символами и дополнением:
def fix_base64(s):
s = "".join(s.split())
s = s.replace("-", "+").replace("_", "/").rstrip("=")
return s + "=" * (-len(s) % 4)
SGVsbG8gd29ybGQ и PDw_Pz8-Pg он исправляет правильно. Но если дать ему PDw/Pz8 Pg==, где + превратился в пробел, он удалит пробел и оставит 9 символов данных. Python тогда падает с ошибкой “number of data characters (9) cannot be 1 more than a multiple of 4”. JSON-экранирование, %3D, склеенные куски и префиксы проскакивают точно так же. Этот инструмент пробует правки по очереди, а замену пробела на плюс применяет, только если у результата получается корректная длина.
Надёжнее чинить проблему у источника: кодируйте Base64 через percent-encoding перед тем, как класть его в URL, или используйте Base64URL, и не пропускайте его через места, которые переносят строки или экранируют текст. Если исправленная строка всё равно декодируется во что-то неожиданное, загляните в разбор ошибок Base64, где описаны кракозябры и двойное кодирование; байты покажет декодер Base64.
Вопросы и ответы
Как исправить «Incorrect padding» в Python?
Допишите =, пока длина не станет кратной 4: s + "=" * (-len(s) % 4). Если ошибка осталась, у строки есть и другие повреждения, например пробелы или экранирование; вставьте её сюда, чтобы увидеть, что ещё не так.
Откуда в моём Base64 пробелы?
Обычно это +, который прошёл через query-строку URL или HTML-форму без percent-кодирования, и принимающая сторона превратила его в пробел. Исправление возвращает + на место, если после этого длина становится корректной.
Может ли исправление потерять данные?
Может, если удаляются недопустимые символы или лишний последний символ, и в списке правок это будет указано. Если инструмент сообщает, что выбросил символ из-за обрезанных данных, достаньте полную копию оригинала и не полагайтесь на результат.
Что означает \u003d в конце моего Base64?
Это JSON-экранирование для =. Некоторые JSON-библиотеки, в том числе Gson, экранируют = ради безопасности в HTML. JSON-парсер автоматически превращает его обратно; исправление делает то же самое, если вставить сырой текст.