技术白皮书

7z 格式技术详解

深入理解 LZMA / LZMA2 算法、固实压缩、AES-256 加密背后的工程设计, 以及 7z 格式与 ZIP / RAR 的关键差异。

什么是 7z 格式?

7z 格式是 7-Zip 项目于 2000 年推出的开源归档格式(扩展名 .7z), 使用 LZMA / LZMA2 字典压缩算法, 默认支持 AES-256 加密、 固实压缩、自解压包、Unicode 文件名等高级特性, 是目前压缩比最高的通用归档格式之一。

7z 格式的规范完全开放(7z.html), 任何人都可自由实现读写, 无专利费用。 7-Zip 官方提供 LZMA / LZMA2 SDK, 已被 xzzstd、Python py7zr、Java SevenZipJBinding 等数百个项目广泛使用。

核心特性

1. 高压缩比

使用 LZMA / LZMA2 算法, 7z 在大多数文件类型上(代码、文档、二进制)压缩比领先 ZIP 30-70%, 领先 RAR5 5-10%。 这是因为 LZMA 字典大小可达 4 GB, 而传统 Deflate 限制为 32 KB。

2. 固实压缩 (Solid Compression)

7z 格式默认开启固实压缩——把多个文件视为一个连续数据流进行压缩, 可利用文件间的重复信息, 进一步提升压缩比 5-15%。 在压缩大量小文件时尤为明显。 代价是访问单个文件时需解压整个数据块。

3. AES-256 加密

支持 AES-256 位对称加密, 密钥派生使用 PBKDF2 (HMAC-SHA256, 100000+ 轮), 远超 ZIP 传统的弱 ZipCrypto。 支持加密文件名 (-mhe=on), 无密码无法列出压缩包内任何文件信息。

4. 自解压包 (SFX)

7z 可创建 .exe 格式的自解压包, 接收方无需安装 7-Zip 双击即可解压。 自解压模块可定制图标、版本信息、弹窗文字。

5. Unicode / 多平台

7z 文件头使用 UTF-8 编码, 完整支持任意语言的文件名(中文、日文、emoji)。 在 Linux / macOS 上可通过 p7zip7zz 完美读写。

LZMA / LZMA2 算法原理

LZMA (Lempel-Ziv-Markov chain Algorithm) 是 Igor Pavlov 于 1998 年设计的字典压缩算法, 是 7z 格式的默认压缩核心。

压缩过程

  1. 滑动字典匹配: 寻找最近出现过的字节序列 (滑动窗口, 默认 4 MB)。
  2. 范围编码 (Range Coder): 用概率模型对匹配结果进行算术编码。
  3. 链式 Markov 模型: 根据字节上下文动态调整概率。

LZMA2 是 LZMA 的改进版, 核心改进是:

  • 支持多线程并行压缩 (lzma2 + t* 参数)
  • 改善对不可压缩数据的处理 (避免部分坏块导致整包失败)
  • 略微提升压缩比 (1-3%)
# 命令行使用 LZMA2 最高压缩
7z a -t7z -m0=lzma2 -mx=9 archive.7z *
# -mx=9 是 7-Zip 预设的「极限压缩」档位
# 字典大小 = 1536 MB, 线程 = 2 (单文件)

文件结构

7z 文件由 Signature Header + 多个 Streams 组成, 总体结构如下:

┌──────────────────────────────────────┐
│ Signature Header (32 字节)            │  固定签名: 0x37 0x7A 0xBC 0xAF 0x27 0x1C
│   - 6 字节魔数 0x37 0x7A 0xBC 0xAF 0x27 0x1C     │
│   - 2 字节版本 (0x00 0x04)            │
│   - 4 字节 StartHeader CRC32         │
├──────────────────────────────────────┤
│ Packed Streams (压缩数据流)          │  可包含若干个 Coder
│   - Coder 1: LZMA2 (deflate)         │
│   - Coder 2: AES-256 (encrypt)       │  可选
├──────────────────────────────────────┤
│ Files Information (文件元数据)       │  名称、时间、属性、CRC
├──────────────────────────────────────┤
│ End Header (结束头)                  │  24 字节
│   - StartHeader 偏移                 │
│   - StartHeader CRC32                │
│   - 下一条可选 Header 偏移 (0)       │
└──────────────────────────────────────┘

关键设计: 7z 文件不存储未压缩大小(避免 4GB 限制), 流式解码在解压时实时计算。 这也是 7z 能支持超大文件与流式解压的原因。

7z vs ZIP vs RAR 详细对比

对比项 7z (LZMA2) ZIP (Deflate) RAR5
压缩算法 LZMA2 Deflate / Deflate64 RAR 专有算法
字典大小 4 KB ~ 4 GB 32 KB 4 MB ~ 1 GB
典型压缩比 30% - 40% 50% - 60% 35% - 45%
加密算法 AES-256 ZipCrypto (弱) / AES-256 AES-256
加密文件名 ✗ (普通 ZIP)
固实压缩 ✓ (默认)
自解压
分卷压缩 部分
Unicode 文件名 ✓ (UTF-8) ✓ (UTF-8 flag)
开源 ✓ LGPL 规范开放 / 实现多样 ✗ 专有
Windows 资源管理器原生 ✗ (需安装)
解压速度

推荐使用场景

  • 长期归档 / 备份: 7z 压缩比最高, 节省存储空间。
  • 代码包发布: GitHub Release、npm 包源、conda 等推荐 .tar.gz 或 .7z。
  • 加密敏感数据: AES-256 + 加密文件名, 满足金融级合规。
  • 大文件传输: 分卷压缩 + 断点续传, 比单大文件更稳定。

不推荐使用

  • 需给对方却没有 7-Zip 的场景 (此时选 ZIP 更通用)
  • 服务器实时流式解压 (ZIP 更快)
  • 要嵌入 Office / PDF 文档 (需 ZIP)

命令行速查

# 1. 创建 7z 压缩包
7z a archive.7z file1.txt dir/

# 2. 解压到当前目录
7z x archive.7z

# 3. 解压到指定目录
7z x archive.7z -oC:\output

# 4. 加密压缩 (AES-256, 含文件名)
7z a -p -mhe=on secret.7z *.pdf

# 5. 分卷压缩 (每卷 100 MB)
7z a -v100m big.7z bigfile.iso

# 6. 查看压缩包内容
7z l archive.7z

# 7. 校验压缩包完整性
7z t archive.7z

# 8. 创建自解压包
7z a -sfx7z.sfx installer.exe program_files/

# 9. 极限压缩 (字典 1.5 GB, 慢但最小)
7z a -t7z -mx=9 -md=1536m archive.7z *

常见问题

7z 文件能压缩到比 ZIP 小很多吗?

能, 但并非对所有文件都有效。 对于文本、代码、数据库等高度冗余的数据, 7z 普遍领先 ZIP 30-70%。 对于已经压缩过的格式(JPG、MP4、ZIP 本身), 7z 与 ZIP 几乎相同, 不会再缩小。

7z 文件是否安全?

7z 格式本身仅是归档容器, 安全性由加密算法决定。 7z 使用 AES-256 (256 位密钥) 至今未被破解。 但弱密码仍然易受字典攻击, 建议使用 12+ 字符的随机密码或密码管理器生成。

7z 与 zip.7z 有什么区别?

没有这种格式。 文件扩展名末尾的 .zip.7z 只是扩展名标识, 7-Zip 根据内容而非扩展名识别格式。 修改扩展名不会改变文件性质。

📦 想立即体验 7z 的极致压缩比? 前往 下载页 获取 7-Zip 24.09 (百度网盘 提取码 8888)。