如何将 Base64 解码为 ZIP 文件
- 把 Base64 粘贴到 Base64 或 data URI,或者用 打开 .txt 文件 打开包含它的文本文件。
- 摘要会显示文件和文件夹的数量、解压后的大小及压缩节省的比例、压缩包注释(如果有),以及压缩包是否使用 ZIP64、是否包含受保护的条目。
- 表格列出每个条目的 大小、压缩后 大小和 修改时间,并提供 查看 和 保存 按钮。
- 点击 下载文件 保存压缩包本身。
最多列出 500 个条目;压缩包更大时,会有一行提示还有多少个条目未列出。在你点击按钮之前不会解压任何内容,而且一切都在你的浏览器中进行。页面的内容安全策略(CSP)禁止除 Cloudflare 的浏览量统计以外的网络请求,因此压缩包不可能被上传。
打开压缩包中的单个文件
查看 会解压一个条目并在表格下方预览:图片、PDF、音频和视频、文本和 JSON,甚至 ZIP 中的 ZIP,最多三层。保存 会以该文件自己的名称下载它,不带文件夹路径。每个解压出的条目都会与压缩包中存储的 CRC-32 进行比对,不一致时会提示“校验和不匹配:此条目已损坏。”
普通解压程序容易出错的压缩包,这里的列表也能应付:
- ZIP64 压缩包,用于超过 4 GB 的文件或超过 65,535 个条目。
- 文件名使用 UTF-8、旧版 Windows 工具使用的老式 DOS 代码页 437,或带有 Info-ZIP Unicode 路径字段。
- 自解压压缩包以及前面带有额外数据的其他 ZIP。
- 被截断的压缩包:末尾的目录缺失时,工具会根据每个文件前面的文件头恢复条目,并给出提示:“缺少中央目录(数据似乎被截断了)。”数据被截掉的条目会报告数据缺失。
经典的 ZIP 时间戳没有时区,所以 修改时间 显示的是创建压缩包的那台机器上的时钟时间。如果条目的扩展字段中还带有 Unix 时间戳,则使用该时间戳,并按你的本地时间显示。
哪些条目可以解压
| 条目 | 列出 | 查看和保存 |
|---|---|---|
| 仅存储(方法 0) | 是 | 是 |
| Deflate(方法 8) | 是 | 是 |
| Deflate64、BZIP2、LZMA、Zstandard、XZ、PPMd | 是,括号中注明方法 | 否:“浏览器不支持压缩方法 BZIP2。” |
| 已加密,ZipCrypto 或 AES | 是,标记为 [受保护] | 否:“此条目受密码保护:可以列出,但无法解压。” |
| 文件夹 | 是 | 否 |
Windows、macOS 和 zip 命令创建的压缩包都使用 Deflate。其他方法大多来自 7-Zip 或 WinZip,是有人为了更高的压缩率特意选择的。
zip 炸弹防护
压缩可以把一个很小的下载变成一个巨大的文件。100 MiB 的零字节经 deflate 压缩后大约只有 100 KB,嵌套或特制的压缩包还能把这个比例推得更高。解压某个条目之前,工具会检查压缩包中声明的大小,超过 64 MB 的一律拒绝,并提示“解压到 64.0 MB 时已停止:太大,无法在浏览器中解压(可能是 zip 炸弹)。请改为下载压缩包。”解压过程中,它也会在达到声明大小再加 1 KB 时停止,所以谎报大小的条目无法超出它声称的大小。
摘要行仍会显示声明的总大小,这本身就是一个有用的警告:几百 KB 的压缩包解压后有好几 GB,无论用什么工具解压之前都值得怀疑。
真的是 ZIP 吗?
ZIP 文件以 PK 加两个字节开头,在 Base64 中就是 UEsDB;空压缩包以 UEsFBg 开头。许多格式其实是换了名字的 ZIP 压缩包,工具会指出是哪一种:DOCX、XLSX、PPTX、EPUB、ODT、JAR、APK。它们都可以在这里列出和解压;Office 文档还可以在 Base64 转 Word 和 Base64 转 Excel 中预览文本。
其他压缩格式不是 ZIP。工具能解压 gzip,但无法打开 7-Zip 或 RAR:
| Base64 开头 | 格式 | 结果 |
|---|---|---|
H4sI | gzip(.gz、.tar.gz) | 解压并预览,提供 下载为 .gz |
N3q8ryc | 7-Zip | “这看起来不像 ZIP(检测到:7-Zip)” |
UmFyIRo | RAR | “这看起来不像 ZIP(检测到:RAR)” |
对于 7-Zip 和 RAR,扩展名 会保持为 zip。下载前请把它改为 7z 或 rar,否则系统会尝试把它当作 ZIP 打开,结果会失败。
用 Python 解压 Base64 ZIP
zipfile 可以直接读取解码后的字节,无需先写入磁盘:
import base64, io, zipfile
with open("archive.b64") as f:
data = base64.b64decode(f.read())
with zipfile.ZipFile(io.BytesIO(data)) as z:
for info in z.infolist():
print(f"{info.filename:20} {info.file_size:>8} method={info.compress_type}")
z.extract("docs/readme.txt", "out")
method 列显示的数字与上表一致:0 为仅存储,8 为 Deflate,12 为 BZIP2,14 为 LZMA。这四种 Python 都能解压。在 shell 中,base64 -d archive.b64 > archive.zip && unzip -l archive.zip 可以列出内容。要从文件生成这样的字符串,请参阅 ZIP 转 Base64 和 Python 中的 Base64。
常见问题
怎么把 Base64 转换成 ZIP 文件?
把字符串粘贴到上方,点击 下载文件 即可保存为 decoded.zip。如果只想取出其中一个文件,点击列表中该文件旁边的 保存。
能在这里打开受密码保护的 ZIP 吗?
条目会列出来并带有 [受保护] 标记,但无法在浏览器中解压。请下载压缩包,用 7-Zip、unzip 或系统自带的解压工具打开,它们会要求输入密码。
为什么某个条目提示不支持其压缩方法?
浏览器只能解压 Deflate,几乎所有 ZIP 都使用这种方法。用 BZIP2、LZMA、Deflate64、Zstandard 或 PPMd 压缩的条目(通常出自 7-Zip 或 WinZip)会被列出,但需要用桌面工具或 Python 的 zipfile 解压,后者能读取 BZIP2 和 LZMA。
我的 Base64 以 H4sI 开头,这是 ZIP 吗?
不是,那是 gzip。工具会提示它看起来是 GZIP,解压后显示其中的内容;.tar.gz 里面是一个 TAR 归档。下载为 .gz 会使用正确的扩展名保存。