Como compactar com gzip e codificar em Base64
- Digite ou cole o texto na entrada, ou arraste um arquivo. Ao vivo vem ligado, então a saída se atualiza enquanto você digita.
- Deixe Formato em gzip. zlib, deflate bruto e, quando o navegador suporta, Brotli estão na mesma lista.
- Marque URL-safe (- _) se a string vai para uma URL ou um nome de arquivo, ou Quebrar em 76 para e-mail e linhas no tamanho do PEM.
- Clique em Copiar saída, em Baixar para salvar o Base64 como arquivo
.txt, ou em Baixar arquivo compactado para salvar o.gzbinário.
A linha de informações mostra o tamanho da entrada, o tamanho compactado, o tamanho em Base64 e a taxa, e o status diz quanto o resultado ficou mais curto ou mais longo que o Base64 puro da mesma entrada.
Quando vale a pena compactar antes
O Base64 sempre aumenta os dados em um terço. Em dados com repetição, o gzip recupera isso e mais.
| Entrada | Base64 puro | Gzip + Base64 |
|---|---|---|
Hello, world! (13 bytes) | 20 caracteres | 44 caracteres |
| Um array JSON de 9.281 bytes com 100 registros de produtos | 12.376 caracteres | 1.096 caracteres |
| Uma foto JPEG | cerca de 4/3 do arquivo | um pouco mais longo que o Base64 puro |
Os números foram gerados com gzip -6. O compressor do navegador pode diferir por alguns bytes, e a linha de informações mostra os números exatos para a sua entrada. Como regra prática, entradas abaixo de uns 100 bytes e qualquer coisa já compactada ficam melhores em Base64 puro.
Onde strings gzip + Base64 aparecem
- Cloud-init e user data de VMs: o cloud-init detecta user data compactado com gzip, o que ajuda a ficar abaixo dos limites de tamanho dos serviços de metadados da nuvem.
- Assinaturas do AWS CloudWatch Logs entregam lotes de logs ao Lambda como Base64 de gzip em
awslogs.data. - O Helm 3 guarda cada release como Base64 de JSON compactado com gzip dentro de um Secret do Kubernetes.
- Variáveis de ambiente e campos JSON que precisam guardar um arquivo de configuração ou um bloco grande de texto.
- Query strings e deep links com um objeto de estado. Use a saída URL-safe nesses casos.
Além do prefixo H4sI, nada no Base64 avisa a quem recebe que os dados são gzip. Deixe isso claro no nome do campo ou na documentação da API, ou, via HTTP, envie o corpo binário com Content-Encoding: gzip em vez de Base64.
Gzip + Base64 no código
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");
Nos navegadores, new CompressionStream("gzip") faz a compressão, e é isso que esta página usa. Há mais exemplos nas páginas de Python e Node.js.
Problemas comuns
- O destino recebe lixo: ele decodificou o Base64 mas não descompactou o gzip. Procure o
H4sIe descompacte com o decodificador gzip Base64. - “incorrect header check” do outro lado: o destino espera zlib, não gzip. Troque Formato para zlib (deflate); a página do zlib explica qual biblioteca espera qual formato.
- Brotli aparece desativado: a API de compressão nativa do navegador não oferece Brotli, e a página avisa isso abaixo das opções.
- A saída difere da de outra ferramenta: cabeçalhos gzip trazem um timestamp e um byte de sistema operacional, e os compressores escolhem níveis diferentes. Bytes diferentes podem descompactar para o mesmo conteúdo.
Perguntas frequentes
Compactar com gzip antes do Base64 deixa a string mais curta?
Para texto, JSON, XML e logs com mais de algumas centenas de bytes, geralmente deixa muito mais curta. Para strings curtas e dados já compactados (JPEG, PNG, ZIP, MP4), o resultado fica mais longo, porque o gzip adiciona 18 bytes de cabeçalho e rodapé.
Por que toda string gzip em Base64 começa com H4sI?
Dados gzip começam com os bytes 1F 8B 08, e esses três bytes são H4sI em Base64. Os caracteres seguintes dependem das flags e do timestamp: H4sIAAAAAAAA significa sem nome de arquivo e sem data de modificação.
Como compactar com gzip e codificar em Base64 no terminal?
No Linux: gzip -nc file.json | base64 -w0. No macOS, onde o base64 não tem -w, use gzip -nc file.json | base64 | tr -d '\n'. O -n deixa de fora o nome e a data do arquivo, então a mesma entrada gera a mesma saída.