Как сжать zlib и закодировать в Base64
- Введите или вставьте текст либо перетащите файл.
- В поле Формат по умолчанию стоит zlib (deflate). Переключите на Raw deflate, если получателю нужен голый поток, или на gzip.
- При желании отметьте URL-safe (- _) или Перенос по 76.
- Нажмите Скопировать результат или скачайте Base64 в
.txtлибо бинарный файл.zz/.deflate.
Поменять местами отправляет результат на сторону Распаковать, чтобы проверить обратное преобразование.
Один текст в трёх обёртках
Hello, world! (13 байт), сжатый с уровнем по умолчанию:
| Формат | Байт | Base64 |
|---|---|---|
| raw deflate | 15 | 80jNycnXUSjPL8pJUQQA |
| zlib | 21 | eJzzSM3JyddRKM8vyklRBAAgXgSK |
| gzip | 33 | H4sIAAAAAAAAA/NIzcnJ11Eozy/KSVEEAObG5usNAAAA |
Во всех трёх лежит один и тот же поток deflate в 15 байт. Base64 всё равно выглядит по-разному: заголовки в 2 и 10 байт сдвигают положение каждого байта в группах по 3. На уровне по умолчанию заголовок zlib равен 78 9C, поэтому Base64 от zlib начинается с eJ. На уровне 9 заголовок 78 DA даёт в Base64 eN.
Какой вызов даёт какой формат
Большинство ошибок с «deflate» возникает, когда две стороны называют одним словом разные обёртки:
| Язык | zlib (RFC 1950) | raw deflate (RFC 1951) | gzip |
|---|---|---|---|
| Python | zlib.compress() | zlib.compressobj(wbits=-15) | gzip.compress() |
| Node.js | zlib.deflateSync() | zlib.deflateRawSync() | zlib.gzipSync() |
| Браузер | CompressionStream("deflate") | CompressionStream("deflate-raw") | CompressionStream("gzip") |
| PHP | gzcompress() | gzdeflate() | gzencode() |
| Java | new Deflater() | new Deflater(level, true) | GZIPOutputStream |
| .NET | ZLibStream (.NET 6+) | DeflateStream | GZipStream |
| Go | compress/zlib | compress/flate | compress/gzip |
Ловушки здесь такие: DeflateStream в .NET и compress/flate в Go выдают raw, а «deflate» в Node и в браузере означает zlib. Сервис на C# и клиент на Node, которые оба «используют deflate», не поймут друг друга, пока одну из сторон не поправят.
Где встречается каждая обёртка
- zlib: потоки
FlateDecodeв PDF, данные изображения в PNG, объекты Git, многие бинарные протоколы и форматы сохранений игр. - raw deflate: привязка SAML HTTP-Redirect (с ней справляется декодер SAML), записи внутри ZIP-файлов, WebSocket
permessage-deflate. - gzip: файлы, HTTP, логи. Про него есть отдельная страница gzip.
Zlib + Base64 в коде
import base64, zlib
packed = base64.b64encode(zlib.compress(b"Hello, world!")).decode()
# 'eJzzSM3JyddRKM8vyklRBAAgXgSK'
text = zlib.decompress(base64.b64decode(packed))
// Node.js: raw deflate for a SAML-style payload
const zlib = require("zlib");
const packed = zlib.deflateRawSync(Buffer.from("Hello, world!")).toString("base64");
// '80jNycnXUSjPL8pJUQQA'
Чтобы прочитать такие строки обратно, используйте декодер Base64 для gzip и zlib, который определяет все три обёртки. Подробнее в статьях про Python и Node.js.
Частые проблемы
incorrect header check: декодер zlib получил raw deflate или gzip. Подберите нужную обёртку.invalid stored block lengthsилиinvalid block type: декодеру raw deflate дали данные zlib, и два байта заголовка читаются как блоки deflate.- Результат длиннее исходника: короткие строки не сжимаются. Примерно до 50–100 байт обычный Base64 короче.
- Байты отличаются от результата другого инструмента: уровень сжатия и реализация меняют вывод. Любой корректный распаковщик всё равно вернёт исходные данные.
Вопросы и ответы
Чем zlib отличается от deflate?
Deflate называют сам алгоритм сжатия, а raw deflate означает голый сжатый поток. Zlib добавляет вокруг него 2-байтовый заголовок и 4-байтовую контрольную сумму Adler-32, gzip добавляет 10-байтовый заголовок и 8-байтовый хвост с CRC-32. Сжатые данные в середине одинаковы.
Откуда берётся ошибка «incorrect header check»?
Распаковщик ждал заголовок zlib, а получил что-то другое, чаще всего raw deflate или gzip. Используйте подходящий вызов (zlib.decompress(data, -15) в Python для raw deflate) или перекодируйте в формат, который ждёт получатель.
Content-Encoding: deflate в HTTP означает raw deflate или zlib?
По спецификации HTTP это zlib. Некоторые старые серверы отправляли под этим именем raw deflate, поэтому для HTTP надёжнее gzip.