技术

ZIP / RAR / 7Z / TAR 压缩包格式解析:从比特流看压缩原理

📅 2026-07-15 · ✍️ 闪压团队 · ⏱ 7 分钟阅读

压缩包(archive)≠ 压缩(compression)。压缩包是容器,负责把多个文件 + 元数据组织成一个文件;压缩是算法,负责把字节流压得更小。

主流的 ZIP、7Z、RAR、TAR 既是容器也是压缩算法(或组合)。本文从二进制层面拆解它们的结构差异。

一、ZIP:最通用,但有 35 年历史包袱

ZIP 格式由 PKWARE 公司的 Phil Katz 在 1989 年发布,至今仍是事实标准。

整体结构


[Local File Header 1] [File Data 1] [Data Descriptor 1]
[Local File Header 2] [File Data 2] [Data Descriptor 2]
...
[Local File Header N] [File Data N] [Data Descriptor N]
[Central Directory Entry 1]
[Central Directory Entry 2]
...
[Central Directory Entry N]
[End of Central Directory Record]

三个关键部分

#### 1. Local File Header(本地文件头)

每个文件前都有一个 30 字节的本地头:


偏移  大小    字段
0     4      签名 0x04034b50 ("PK\x03\x04")
4     2      需要的解压版本
6     2      通用位标志(加密 / 字典大小)
8     2      压缩方法(0=存储, 8=DEFLATE)
10    2      最后修改时间
12    2      最后修改日期
14    4      CRC-32
18    4      压缩后大小
22    4      原始大小
26    2      文件名长度
28    2      扩展字段长度
30    n      文件名(UTF-8 或 CP437)
30+n  m      扩展字段
30+n+m  ?    文件数据

#### 2. Central Directory(中央目录)

位于文件末尾,包含所有文件的元数据,允许随机访问(不解压整个包就能列出文件列表)。

#### 3. End of Central Directory Record(中央目录结束记录)

22 字节,告诉解析器中央目录从哪里开始。

ZIP 的局限

  • 文件名编码混乱:早期 ZIP 用 CP437(DOS 编码),中文文件名经常乱码。需要看 General Purpose Bit Flag 11 判断是否是 UTF-8
  • 压缩算法固定:每个文件只能用 ZIP 支持的算法(DEFLATE 是主力),不能混用 LZMA / Zstd
  • 没有真正的加密:传统 ZIP 加密是弱加密(ZipCrypto),密码破解工具几十秒就能破
  • 分卷支持薄弱.z01/.z02/.zip 分卷需要保持顺序,恢复麻烦

二、7Z:开源之王,结构最优雅

7Z 是 7-Zip 配套的容器格式,2000 年首次发布。它的设计目标:

最高压缩率 + 任意压缩算法 + 强加密 + 大文件支持

整体结构


[Signature Header]
[Header]
[Packed Streams]
[Header]
[Packed Streams]
...
[Header for each Pack Stream]
[End Header]

7Z 的核心是 Header 树

  • 签名头(32 字节)指向主 Header
  • 主 Header 是一个属性流(Property Stream),包含所有文件的元数据、压缩方法、CRC 等
  • 文件数据被切分成多个 Pack Streams(压缩流)
  • 每个 Pack Stream 前面有 Coders Header,记录该流用了哪些压缩算法

7Z 的优势

  • 算法无关:每个 Pack Stream 可以用不同算法(LZMA、LZMA2、PPMd、BZip2、DEFLATE 等),甚至链式组合(先 LZMA 再算术编码)
  • AES-256 加密:真正的强加密
  • 超大文件支持:单文件最大 16 EB(理论)
  • LZMA2 多线程:每个 Pack Stream 可独立多线程压缩

7Z 的局限

  • 压缩慢:LZMA 压缩速度比 DEFLATE 慢 5-10 倍
  • 生态较差:macOS、Windows 默认不解压 7Z(需额外装软件)
  • 文档不全:官方格式说明不够详细,第三方实现容易踩坑

三、RAR:闭源之谜,商业软件的事实标准

RAR 由 Eugene Roshal 于 1993 年发布,格式闭源。RAR5(2013 年)是当前主流版本。

RAR 的特点

  • 压缩率高:RAR5 在大多数数据上压缩率优于 ZIP,略低于 7Z
  • 恢复记录(Recovery Record):可设置 N% 的冗余数据,文件部分损坏仍能恢复(这是 RAR 独有的"黑科技")
  • 分卷原生支持.part1.rar / .part2.rar 是真正的原生分卷
  • 强加密:RAR5 用 AES-256 + HMAC-SHA256

RAR 的局限

  • 闭源格式:无官方规范,靠逆向工程(unrar 是合法的开源实现,但 rar 编码器是闭源)
  • 授权费:商用 RAR 编码器需要购买授权(WinRAR 个人免费,商用收费)
  • 不支持流式压缩:必须先扫描整个文件才能开始压缩

恢复记录原理


原始数据 100 MB
  ↓
RAR 编码器把数据切块(如 4 KB / 块)
  ↓
为每块计算 Reed-Solomon 校验码
  ↓
把校验码按 N% 比例插入输出流(如 N=5%,输出 105 MB)

如果文件损坏 1%,Reed-Solomon 算法可以从校验码恢复原始数据。这是 RAR 适合网盘传输、长期备份的核心原因。

四、TAR:容器,不是压缩

TAR(Tape Archive)1979 年起源于 Unix 备份磁带,是纯粹的容器——只负责把多个文件 + 元数据打包,不做压缩。

TAR 结构


[tar Header 1] [File Data 1]
[tar Header 2] [File Data 2]
...
[tar Header N] [File Data N]
[两个 512 字节全 0 表示结束]

每个 Header 512 字节:


偏移  大小  字段
0     100   文件名
100   8     文件权限
108   8     用户 ID
116   8     组 ID
124   12    文件大小(八进制 ASCII)
136   12    修改时间(八进制 ASCII)
148   8     校验和(checksum)
156   1     类型(普通文件/目录/链接)
157   100   链接目标名
257   6     USTAR 魔数 "ustar"
263   2     USTAR 版本
265   32    用户名
297   32    组名
329   8     设备主编号
337   8     设备次编号
345   155   文件名前缀

TAR + GZ / XZ / ZSTD

因为 TAR 不压缩,日常看到的 .tar.gz / .zwc / .tar.zst 都是先 TAR 打包再用 gzip / xz / zstd 压缩。这种组合在 Linux 生态中几乎是事实标准:


$ tar -cf archive.tar /path/to/dir    # 打包
$ gzip archive.tar                     # 压缩 → archive.tar.gz
$ tar -xzf archive.tar.gz              # 一行解压

优势:可以流式处理,无需扫描整个文件;可以用管道串联各种工具。

五、四种格式对比

特性 ZIP 7Z RAR5 TAR + *
压缩率 ⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐ 取决于外部算法
压缩速度 ⭐⭐⭐⭐ ⭐⭐ ⭐⭐⭐ 取决于外部算法
解压速度 ⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐ 取决于外部算法
多算法支持
强加密 ⚠️ ZipCrypto 弱 ✅ AES-256 ✅ AES-256 取决于外部
恢复记录
流式处理
跨平台 ✅✅✅ ✅✅ ✅✅ ✅✅✅
闭源

六、闪压的多格式支持策略

闪压的压缩包解压不是简单"按扩展名调用外部库",而是智能识别 + 多算法引擎


检测到压缩包
  ↓
魔数嗅探(PK\x03\x04 → ZIP;Rar!\x1a\x07 → RAR;7z\xbc\xaf\x27\x1c → 7Z;ustar → TAR)
  ↓
解析容器结构(定位中央目录 / 主 Header)
  ↓
枚举压缩流 + 解码方法
  ↓
调用对应算法引擎(DEFLATE / LZMA / LZMA2 / PPMd / BZip2 / Zstd)
  ↓
自动识别文件名编码(GBK / UTF-8 / Shift-JIS / Big5)
  ↓
并行解压
  ↓
校验 + 写出

智能编码识别

这是闪压独有的能力——

  1. 先按 UTF-8 解码文件名字节
  2. 检测是否包含非法 UTF-8 序列
  3. 如果有,尝试 GBK / Big5 / Shift-JIS / CP949
  4. 看哪种编码能正确解码出"可显示的中文 / 日文 / 韩文"
  5. 用户也可以手动指定编码

这就是为什么你在闪压里解压从老论坛下载的 ZIP 时,中文文件名不再乱码。

七、未来:压缩包格式会消失吗?

短期不会。压缩包作为通用文件交换格式的地位至少还能保持 10 年:

  • 网盘分享、软件分发、操作系统包管理(deb / rpm)都依赖它
  • 即使云存储流行,本地归档、加密传输、合规备份仍需要压缩包

但长期看,可能会被智能容器取代:

  • Content-Addressable Storage(CAS):用哈希做寻址,每个文件天然去重
  • 端到端加密容器:跳过文件系统层,从源头加密(如 Apple Advanced Data Protection)
  • 自适应格式:根据网络条件在客户端自动选择算法

到那时,"压缩包"这个概念可能会演化成"安全、可寻址、自适应的内容单元"。

八、写在最后

理解压缩包格式不是为了手写解析器,而是为了:

  1. 更好地选择工具:跨平台分享选 ZIP / TAR;极致压缩选 7Z;带恢复记录备份选 RAR
  2. 更好地诊断问题:知道为什么 ZIP 文件名会乱码、为什么 RAR 损坏能修复、为什么 7Z 这么慢
  3. 更好地理解工具:闪压的智能识别、乱码修复、批量解压背后做了什么

—— 闪压团队 / 技术部


下一篇实战教程将教你 从基础到高级的压缩包解压技巧,敬请期待。

标签

技术ZIPRAR7ZTAR压缩包格式解析闪压技术

喜欢这篇?下载闪压试试

完全免费 · 本地处理 · 无广告

立即下载闪压