Как сжать gzip и закодировать в Base64
- Введите или вставьте текст в поле ввода либо перетащите файл. На лету включено, так что результат обновляется по ходу ввода.
- Оставьте в поле Формат значение gzip. В том же списке есть zlib, raw deflate и, если браузер поддерживает, Brotli.
- Отметьте URL-safe (- _), если строка пойдёт в URL или имя файла, или Перенос по 76 для почты и длины строк в стиле PEM.
- Нажмите Скопировать результат, Скачать, чтобы сохранить Base64 файлом
.txt, или Скачать сжатый файл, чтобы сохранить двоичный.gz.
В строке с метриками видны размер входа, размер после сжатия, размер Base64 и степень сжатия, а статус сообщает, насколько результат короче или длиннее обычного Base64 от того же входа.
Когда сжимать заранее имеет смысл
Base64 всегда увеличивает данные на треть. Gzip может отыграть это с запасом, но только на данных с повторами.
| Ввод | Обычный Base64 | Gzip + Base64 |
|---|---|---|
Hello, world! (13 байт) | 20 символов | 44 символа |
| Массив JSON из 100 записей о товарах, 9 281 байт | 12 376 символов | 1 096 символов |
| Фотография JPEG | около 4/3 файла | чуть длиннее обычного Base64 |
Цифры получены с gzip -6. Компрессор браузера может отличаться на несколько байт, а точные значения для вашего ввода показывает строка с метриками. Грубое правило: ввод короче примерно 100 байт и всё, что уже сжато, выгоднее кодировать обычным Base64.
Где используются строки gzip + Base64
- Cloud-init и user data виртуальных машин: cloud-init распознаёт user data, сжатые gzip, и это помогает уложиться в ограничения размера облачных сервисов метаданных.
- Подписки AWS CloudWatch Logs передают пачки логов в Lambda как Base64 от gzip в поле
awslogs.data. - Helm 3 кладёт каждый релиз в Kubernetes Secret в виде JSON, сжатого gzip и закодированного в Base64.
- Переменные окружения и поля JSON, в которых должен лежать конфигурационный файл или большой кусок текста.
- Query-строки и диплинки с объектом состояния. Там используйте URL-safe вывод.
Получатель должен знать, что данные сжаты gzip, ведь в самом Base64 на это указывает только префикс H4sI. Отразите это в имени поля или документации API, а при передаче по HTTP лучше отправьте двоичное тело с Content-Encoding: gzip вместо Base64.
Gzip + Base64 в коде
import base64, gzip
data = open("products.json", "rb").read()
packed = base64.b64encode(gzip.compress(data, mtime=0)).decode()
// Node.js
const zlib = require("zlib");
const packed = zlib.gzipSync(Buffer.from(text)).toString("base64");
В браузерах сжимает new CompressionStream("gzip"), его же использует эта страница. Больше примеров на страницах про Python и Node.js.
Частые проблемы
- Получатель видит мусор: он декодировал Base64, но не распаковал gzip. Проверьте префикс
H4sIи распакуйте декодером gzip из Base64. - «incorrect header check» на другой стороне: получатель ждёт zlib, а не gzip. Переключите Формат на zlib (deflate); страница про zlib объясняет, какая библиотека что ожидает.
- Brotli неактивен: встроенный API сжатия браузера не предлагает Brotli, и страница сообщает об этом под параметрами.
- Результат отличается от другого инструмента: в заголовках gzip есть метка времени и байт ОС, а компрессоры выбирают разные уровни сжатия. Разные байты могут распаковываться в одно и то же содержимое.
Вопросы и ответы
Становится ли строка короче, если сжать её gzip перед Base64?
Обычно намного короче, если это текст, JSON, XML или логи больше нескольких сотен байт. Для коротких строк и уже сжатых данных (JPEG, PNG, ZIP, MP4) результат получается длиннее, потому что gzip добавляет 18 байт заголовка и концевика.
Почему каждая строка gzip в Base64 начинается с H4sI?
Данные gzip начинаются с байтов 1F 8B 08, а в Base64 эти три байта записываются как H4sI. Следующие символы зависят от флагов и метки времени: H4sIAAAAAAAA означает, что нет ни имени файла, ни времени изменения.
Как сжать gzip и закодировать в Base64 в терминале?
В Linux: gzip -nc file.json | base64 -w0. В macOS, где у base64 нет -w, используйте gzip -nc file.json | base64 | tr -d '\n'. Флаг -n не записывает имя файла и время, так что одинаковый вход даёт одинаковый результат.