Как декодировать строку gzip в Base64
- Вставьте Base64 в поле ввода или перетащите файл
.gz,.zzили.deflate. Пробелы и переносы строк игнорируются. - Оставьте в поле Формат значение Автоопределение. В статусе появится найденный формат, например «Определено: gzip».
- Текст появится в поле результата, JSON будет отформатирован. Если результат двоичный, страница определит тип файла и покажет кнопку Скачать.
- Для gzip в сведениях видны ещё исходное имя файла и время изменения, если отправитель их сохранил.
Как отличить gzip, zlib и deflate
Все три формата используют одно и то же сжатие DEFLATE и различаются только обёрткой. Её видно по первым символам Base64:
| Начинается с | Формат | Откуда обычно берётся |
|---|---|---|
H4sI | gzip (1F 8B 08) | gzip, GZIPOutputStream, тела HTTP-ответов, CloudWatch Logs |
eJ | zlib, уровень по умолчанию (78 9C) | zlib.compress(), PHP gzcompress(), потоки PDF |
eNo–eNr | zlib, максимальное сжатие (78 DA) | уровни 7–9 |
eAE–eAH, eF4–eF7 | zlib, самые быстрые и низкие уровни (78 01, 78 5E) | уровни 1–5 |
| нет постоянного префикса | raw deflate | SAML Redirect binding, PHP gzdeflate(), элементы ZIP |
SDRzSU | gzip, дважды закодированный в Base64 | Secrets релизов Helm |
У raw deflate нет сигнатуры, поэтому автоопределение пробует его после того, как не подошли gzip и zlib. У Brotli сигнатуры тоже нет, его пробуют последним, если браузер его поддерживает.
Реальные примеры
AWS CloudWatch Logs: события подписки приходят в Lambda в виде {"awslogs": {"data": "H4sI…"}}. Вставьте значение data и получите JSON с logGroup, logStream и logEvents.
Secrets релизов Helm 3 хранят Base64 от JSON, сжатого gzip, а Kubernetes кодирует его в Base64 ещё раз. Из командной строки:
kubectl get secret sh.helm.release.v1.myapp.v3 -o jsonpath='{.data.release}' \
| base64 --decode | base64 --decode | gunzip | jq -r .manifest
На сайте снимите внешний слой декодером Kubernetes Secret или декодером Base64, а получившуюся строку H4sI… вставьте сюда.
Сообщения SAML Redirect сжаты raw deflate. Они декодируются и здесь, но декодер SAML вдобавок снимает URL-кодирование и показывает сводку по XML.
Декодирование в Python и Node.js
import base64, zlib
raw = base64.b64decode(s)
text = zlib.decompress(raw, 47).decode() # 47 = 32 + 15: accept gzip or zlib
const zlib = require("zlib");
const text = zlib.unzipSync(Buffer.from(s, "base64")).toString(); // gzip or zlib
Для raw deflate используйте zlib.decompress(raw, -15) в Python и zlib.inflateRawSync() в Node. Подробнее в статьях Base64 в Python и Base64 в Node.js.
Ошибки и ограничения
- «Это корректный Base64, но не данные gzip, zlib или raw deflate.» Строку вообще не сжимали. Попробуйте декодер Base64 или, для двоичных данных, Base64 в файл.
- «Это не корректные данные gzip, или они обрезаны.» Часть строки потерялась, часто из-за лимита длины строки в логе. Скопируйте её из источника ещё раз.
- «Лишние байты после сжатого потока проигнорированы.» После конца потока что-то дописано. Данные до этого места сохраняются.
- «Распакованные данные больше 256.0 MB, поэтому распаковка остановлена (возможно, это zip-бомба)». Размер результата ограничен для защиты от zip-бомб. Всё, что больше, распаковывайте локально через
gunzip. - Файлы gzip из нескольких частей (несколько склеенных потоков gzip) не поддерживаются.
Вопросы и ответы
Что значит H4sI в начале строки Base64?
Это Base64-запись байтов 1F 8B 08: сигнатура gzip плюс байт метода deflate. Строка с H4sI в начале содержит данные gzip: декодируйте Base64, а байты распакуйте через gunzip.
Как декодировать Base64 gzip в командной строке?
echo 'H4sI…' | base64 --decode | gunzip в Linux и macOS. Данные zlib (eJ…) gunzip не примет из-за другого заголовка; после шага с Base64 используйте python3 -c 'import sys,zlib; sys.stdout.buffer.write(zlib.decompress(sys.stdin.buffer.read()))'.
Почему после декодирования Base64 получаются двоичные данные?
Потому что данные сжали перед кодированием, а декодер Base64 возвращает сжатые байты. Вставьте строку сюда, и она распакуется автоматически.
Можно ли так открыть .zip или .tar.gz?
.tar.gz распаковывается в архив .tar, его можно скачать. У ZIP другой формат контейнера: чтобы посмотреть список файлов и сохранить их, используйте Base64 в ZIP.