如何解码 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 |
| 无固定前缀 | 原始 deflate | SAML Redirect 绑定、PHP gzdeflate()、ZIP 条目 |
SDRzSU | 被 Base64 编码了两次的 gzip | Helm release Secret |
原始 deflate 没有签名,所以自动检测会在 gzip 和 zlib 都失败之后再尝试它。Brotli 同样没有签名,会在最后尝试,前提是浏览器支持。
实际场景中的载荷
AWS CloudWatch Logs 的订阅事件以 {"awslogs": {"data": "H4sI…"}} 的形式到达 Lambda。粘贴 data 的值,就能读到包含 logGroup、logStream 和 logEvents 的 JSON。
Helm 3 release Secret 里存的是 gzip 压缩后 JSON 的 Base64,Kubernetes 又对它做了一次 Base64 编码。在 shell 中:
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 消息 是原始 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
原始 deflate 在 Python 中用 zlib.decompress(raw, -15),在 Node 中用 zlib.inflateRawSync()。见 Python 中的 Base64 和 Node.js 中的 Base64。
错误和限制
- “这是有效的 Base64,但不是 gzip、zlib 或原始 deflate 数据。” 这个字符串从来没有被压缩过。试试 Base64 解码器,二进制数据请用 Base64 转文件。
- “这不是有效的 gzip 数据,或者已被截断。” 字符串缺了一部分,通常是被日志单行长度限制截掉了。请从源头重新复制。
- “已忽略压缩流之后的多余字节。” 数据流结束之后被追加了别的内容。之前的数据会保留。
- “解压后的数据大于 256.0 MB,已停止(可能是 zip 炸弹)。” 为防范解压炸弹,输出设有上限。这么大的数据请在本地用
gunzip处理。 - 不支持多成员 gzip 文件(多个 gzip 流拼接在一起)。
常见问题
Base64 字符串开头的 H4sI 是什么意思?
它是 1F 8B 08 的 Base64 形式,即 gzip 签名加上表示 deflate 方法的字节。以 H4sI 开头的字符串就是 gzip 数据:先做 Base64 解码,再对字节执行 gunzip。
怎么在命令行里解码 Base64 gzip?
Linux 和 macOS 上用 echo 'H4sI…' | base64 --decode | gunzip。对于 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 列出并保存其中的文件。