Como compactar com zlib e codificar em Base64
- Digite ou cole o texto, ou arraste um arquivo.
- Formato começa em zlib (deflate). Mude para Deflate bruto quando o destino quiser o stream puro, ou para gzip.
- Se quiser, marque URL-safe (- _) ou Quebrar em 76.
- Use Copiar saída, ou baixe o
.txtcom o Base64 ou o arquivo binário.zz/.deflate.
Inverter envia a saída para o lado Descompactar, para conferir a ida e volta.
O mesmo texto em três envelopes
Hello, world! (13 bytes), compactado no nível padrão:
| Formato | Bytes | Base64 |
|---|---|---|
| deflate bruto | 15 | 80jNycnXUSjPL8pJUQQA |
| zlib | 21 | eJzzSM3JyddRKM8vyklRBAAgXgSK |
| gzip | 33 | H4sIAAAAAAAAA/NIzcnJ11Eozy/KSVEEAObG5usNAAAA |
O stream deflate são os mesmos 15 bytes nos três, e mesmo assim o Base64 parece diferente, porque os cabeçalhos de 2 e 10 bytes deslocam a posição de cada byte nos grupos de 3 bytes. O cabeçalho do zlib é 78 9C no nível padrão, e é por isso que o Base64 de zlib começa com eJ. No nível 9 ele é 78 DA, Base64 eN.
Qual chamada gera qual formato
A maioria dos bugs de “deflate” vem de dois lados usando a mesma palavra para envelopes diferentes:
| Linguagem | zlib (RFC 1950) | deflate bruto (RFC 1951) | gzip |
|---|---|---|---|
| Python | zlib.compress() | zlib.compressobj(wbits=-15) | gzip.compress() |
| Node.js | zlib.deflateSync() | zlib.deflateRawSync() | zlib.gzipSync() |
| Navegador | 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 |
Repare nas armadilhas: o DeflateStream do .NET e o compress/flate do Go são brutos, enquanto o “deflate” do Node e do navegador é zlib. Um serviço em C# e um cliente em Node que “usam deflate” não vão se entender sem uma mudança de um dos lados.
Onde cada envelope aparece
- zlib: streams
FlateDecodede PDF, dados de imagem PNG, objetos do Git, muitos protocolos binários e formatos de save de jogos. - deflate bruto: o binding HTTP-Redirect do SAML (o decodificador SAML cuida dele), entradas dentro de arquivos ZIP,
permessage-deflatedo WebSocket. - gzip: arquivos, HTTP, logs. A página de gzip trata dele.
Zlib + Base64 no código
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'
Para ler essas strings de volta, use o decodificador Base64 de gzip e zlib, que detecta os três envelopes. Mais em Python e Node.js.
Problemas comuns
incorrect header check: decodificador zlib recebendo dados brutos ou gzip. Use o envelope correspondente.invalid stored block lengthsouinvalid block type: decodificador de deflate bruto recebendo dados zlib; os dois bytes de cabeçalho são lidos como blocos deflate.- O resultado é maior que a entrada: strings curtas não comprimem. Abaixo de uns 50–100 bytes, o Base64 puro é mais curto.
- A saída não bate byte a byte com a de outra ferramenta: o nível de compressão e a biblioteca mudam os bytes, e qualquer descompactador correto devolve o mesmo original a partir de qualquer uma das duas.
Perguntas frequentes
Qual é a diferença entre zlib e deflate?
Deflate é o algoritmo de compressão. O deflate bruto é o stream compactado puro; o zlib acrescenta um cabeçalho de 2 bytes e um checksum Adler-32 de 4 bytes ao redor dele; o gzip acrescenta um cabeçalho de 10 bytes e um trailer de 8 bytes com CRC-32. Os dados compactados no meio são idênticos.
O que causa 'incorrect header check'?
O descompactador esperava um cabeçalho zlib e recebeu outra coisa, na maioria das vezes deflate bruto ou gzip. Use a chamada correspondente (zlib.decompress(data, -15) no Python para deflate bruto) ou codifique de novo com o formato que o destino espera.
O Content-Encoding: deflate do HTTP é deflate bruto ou zlib?
A especificação do HTTP diz zlib. Alguns servidores antigos enviavam deflate bruto com esse nome, e é por isso que o gzip é a escolha mais segura para HTTP.