BZIP2 压缩包 (.bz2)
Bzip2 标准Bzip2 (BZ2) 是一种经典的无专利 Unix 压缩实用程序和文件格式,由 Julian Seward 创建,利用 Burrows-Wheeler 变换实现了比经典 Gzip 更高的压缩率。
检查与元数据
操作系统和文件分析器通过检查开头的二进制字节序列来识别 BZ2 文件:
字节级文件头签名 (Magic Bytes)
操作系统和文件分析器通过检查开头的二进制字节序列来识别 BZ2 文件:
十六进制签名 (偏移量 0):
42 5A 68ASCII 表示形式: BZh
标准化: Bzip2 Open Source Standard
技术规格
| 容器架构 | Stream header ('BZh' + block size digit 1-9) followed by compressed data blocks and 32-bit CRC |
| 压缩方式 | Burrows-Wheeler Transform (BWT), Move-to-Front (MTF) transform, and Huffman coding |
| 字节序 | Big-Endian bitstream framing |
| 色彩空间 | N/A (Byte Compression Stream) |
| 通道与结构 | Single-file compressed byte stream |
| 最大尺寸 | Unbounded stream length (supports arbitrary file sizes) |
| 透明度 | 100% bit-exact lossless data preservation |
| 流式传输与渐进式加载 | Sequential block-by-block streaming with independent per-block CRC checksums |
技术对比矩阵:BZ2 对比同类产品
| 技术属性 | BZ2 (当前) | GZ | XZ | ZSTD |
|---|---|---|---|---|
| 核心算法 | Burrows-Wheeler 变换 (BWT) | Deflate (LZ77 + 霍夫曼) | LZMA / LZMA2 | 有限状态熵 + LZ77 |
| 与 Gzip 相比的压缩率 | 比 Gzip 小 10% - 20% | 基准标准 | 比 Gzip 小 20% - 30% | 比 Gzip 小 10% - 20% |
| 解压速度 | 慢(约 30-50 MB/s) | 快(约 300 MB/s) | 中等(约 100 MB/s) | 极快(>1.5 GB/s) |
| 块校验和 | 每块 32 位 CRC | 单流 CRC32 | 流 CRC64 | 流 xxHash64 |
常见损坏模式与十六进制恢复指南
提取时中止并显示"bzip2: Data integrity error when decompressing"(bzip2:解压时数据完整性错误)。
根本原因: 压缩块中的位翻转导致 BWT 逆置换矩阵无法通过 CRC32 验证。
恢复方法: 使用"bzip2recover"实用程序抢救损坏扇区周围未损坏的块。
安全分析与解析器攻击向量
Bzip2 的实现涉及复杂的位流排序和霍夫曼表解析,历史上曾出现过整数溢出漏洞。
已知攻击向量
- BWT 排序数组分配中的整数溢出(例如 CVE-2016-3189)。
- 霍夫曼解码表组装期间的越界写入。
- 通过病态输入模式导致最坏情况下的二次 BWT 排序时间,从而造成拒绝服务。
防御性最佳实践:
历史渊源与里程碑
2019Federico Mena Quintero 在 bzip3 和现代开源计划的推动下,对 bzip2 代码库的维护进行了现代化改造。
2000发布 1.0 版本,使 bzip2 格式在各个 Linux 发行版和包管理器中趋于稳定。
1996Julian Seward 发布了 bzip2 0.15,以取代存在专利问题的早期 bzip 格式。
核心优势与特点
- 在源代码压缩包、系统日志和文本数据库上,性能始终比经典 Gzip 高出 10% 到 20%。
- 独立的块架构(100k 到 900k)包含每个块的 32 位 CRC 校验和,用于强大的完整性检查。
- 在所有 Linux、BSD 和 macOS 命令行发行版中实现通用原生可用性。
技术局限与劣势
- 与 Zstandard 等现代算法相比,压缩和解压速度明显较慢。
- 仅支持单文件压缩:需要与 TAR(.tar.bz2)配合使用才能打包多个文件或目录。
- 解压时比 Gzip 或 Zstd 消耗更多的 CPU 资源。
趣味技术冷知识
- "BZh"魔术字节代表"Burrows-Wheeler Zip Huffman",后面跟着一个数字('1' 到 '9'),表示以千字节为单位的块大小(例如"BZh9"= 900 KB)。
- Linux 内核源代码在迁移到 .xz 之前,曾独家以 .tar.bz2 格式分发了十多年。
- Burrows-Wheeler 变换不直接压缩数据;它置换字符的顺序,使相同的字母聚集在一起,从而可以通过霍夫曼编码轻松进行压缩。
常见技术问题
.gz 和 .bz2 有什么区别?
.bz2 使用 Burrows-Wheeler 变换来实现比 .gz 更小的文件体积,但它需要更多的压缩和解压时间。
为什么 bzip2 包含 'bzip2recover' 命令?
因为 bzip2 将数据压缩在独立的 900 KB 块中(每个块都有自己的 CRC),所以即使文件的某一部分损坏,bzip2recover 也能提取未损坏的块。
如何提取 .tar.bz2 文件?
你可以使用 File2File.app 直接在网页浏览器中解压 .tar.bz2 文件,而无需运行命令行工具。