BZIP2 壓縮檔 (.bz2)
Bzip2 標準Bzip2(BZ2)是由 Julian Seward 所建立的經典免專利 Unix 壓縮公用程式與檔案格式,採用 Burrows-Wheeler 轉換以達到比經典 Gzip 更高的壓縮率。
檢查與中繼資料
作業系統與檔案分析工具透過檢查開頭的二進位位元組序列來識別 BZ2 檔案:
位元組層級標頭簽章(檔案簽章)
作業系統與檔案分析工具透過檢查開頭的二進位位元組序列來識別 BZ2 檔案:
十六進位簽章(偏移量 0):
42 5A 68ASCII 表示法: BZh
標準化: Bzip2 開源標準
技術規格
| 容器架構 | 資料流標頭(「BZh」加區塊大小數字 1-9)後接壓縮資料區塊與 32 位元 CRC |
| 壓縮 | Burrows-Wheeler 轉換(BWT)、Move-to-Front(MTF)轉換與霍夫曼編碼 |
| 位元組序 | 大端序位元串流分框 |
| 色彩空間 | 不適用(位元組壓縮資料流) |
| 色版與結構 | 單一檔案壓縮位元組資料流 |
| 最大尺寸 | 無限制資料流長度(支援任意檔案大小) |
| 透明度 | 100% 位元精確無損資料保留 |
| 串流與漸進式 | 循序區塊串流,具備獨立的各區塊 CRC 檢查碼 |
技術比較矩陣: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 排序時間的異常輸入模式進行阻斷服務攻擊。
防禦最佳實務: 使用強制記憶體邊界的記憶體安全 WASM 解碼器來解碼 BZ2 檔案。
歷史起源與里程碑
2019Federico Mena Quintero 在 bzip3 與現代開源計畫下推動 bzip2 程式碼庫維護的現代化。
2000發布 1.0 版本,使 bzip2 格式在各大 Linux 發行版與套件管理程式中趨於穩定。
1996Julian Seward 發布 bzip2 0.15 以取代先前具有專利疑慮的 bzip 格式。
主要優勢與優點
- 在原始碼 tarball、系統記錄檔與文字資料庫上,效能持續優於經典 Gzip 約 10% 至 20%。
- 獨立的區塊架構(100k 至 900k)包含各區塊 32 位元 CRC 檢查碼,以提供強固的完整性檢查。
- 原生可用於許多 Linux、BSD 與 macOS 命令列發行版,不過實際內含情況各異。
技術限制與缺點
- 相較於 Zstandard 等現代演算法,壓縮與解壓縮速度顯著較慢。
- 僅支援單一檔案壓縮:需要搭配 TAR(.tar.bz2)來封裝多個檔案或目錄。
- 解壓縮時的 CPU 使用率高於 Gzip 或 Zstd。
有趣的技術冷知識
- 「BZh」檔案簽章(magic bytes)代表「Burrows-Wheeler Zip Huffman」,後面接著一個數字(「1」到「9」),表示以 100 KB 為單位的區塊大小(例如「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 檔案,無須執行命令列工具。