7z檔案格式及其原始碼的分析

2021-08-24 17:54:59 字數 2571 閱讀 7695

本文是乙個系列. 主要是分享我最近一年做7z檔案開發的經驗. 主要包括7z官方原始碼的結構分析, 以及7z檔案格式的分析. 其中涉及到7z原始碼結構的各個細節, 以及7z檔案格式的具體細節. 本文適合物件: 想要了解學習7z原始碼的開發人員, 想要了解7z檔案格式細節, 做7z檔案壓縮器和解壓器的開發人員, 以及其他壓縮檔案愛好者等等.

目前7z的最新穩定版是9.20, 而9.30版本還在alpha版本. 所以本文是基於其9.20版本.  我將盡可能詳細的描述所有細節, 但到目前為止我了解到的細節大概能到八成到九成的樣子. 也不是百分百.  希望能和大家共同討論學習.  這些資訊足以開發乙個工業級別的高相容性的7z壓縮器和解壓器了.

好了, 憋死我了, 前面的客套話終於說完了.  有人可能要問, 為什麼要分析7z檔案格式? 這個不是開放的嗎? 為什麼我前面說我只了解到八,九成, 而不是百分百呢?

我先來解釋這幾個問題, 這能說明本文的必要性, 以及看下去的必要性.  首先7z的確是開放的. 但他的格式說明非常簡單, 簡直是簡陋. 簡單的乙個txt檔案,寥寥幾十行算不上說明的符號, 對複雜的7z格式來說, 簡直就是天書.( 後面分析7z原始碼的時候會詳細說道這一點. )  所以如果你接到老闆的乙個通知:」我們要做7z相容的壓縮解壓器」 的時候, 你就要崩潰了.  因為相對於zip這些經過標準化的檔案格式來說, 7z幾乎就是乙個黑洞.(zip有標準化的 spec, 裡面有詳細到位元組級別的說明).   所以我分析7z格式可以說有一半是通過閱讀原始碼逆向推測出檔案格式的, 再經過反覆和原始碼對比測試證明其正確性的.  所以我只能說了解到了**成, 而不是百分百.

7z的官方主頁:   (它託管在sourceforge的虛擬機器上, 本來能開啟的, 但是前一段時間開始被牆了, 我實在想不到牆它的理由, 可能是被sourceforge主機上其他的**拖累的吧,***).

7z的官方中文映象:     這個不需要翻牆.  是官方給出的中文版鏈結. 值得信賴. 上面的內容基本和官方主頁保持一致.

我們先從幾個概念開始吧 :    7z軟體 和7z檔案.   7z檔案指的是一種字尾名為.7z的檔案.    7z軟體指的是作者開發的生成和操作7z檔案的工具.  但是現在7z軟體已經發展到不光支援7z格式的檔案了, 還能額外的生成和編輯另外幾十種檔案格式了. 其中包括我們熟知的zip格式, rar格式, iso格式等等,  也包括一些不可思議的格式, 比如: cab, chm, cpio, cramfs, deb, dmg, fat . 看眼花了吧.  好吧, 本文主要討論 7z檔案格式, 以及7z軟體中主要和7z檔案相關的功能. 當然也會粗略的涉及到其他的一些有用的功能,  比如如何給7z軟體寫外掛程式, 讓他支援我們自己定義的檔案格式.

再來幾個概念.  說到壓縮檔案, 一般會遇到兩個概念,   乙個是 「compress」(壓縮) 和」archive」 (存檔).    「存檔」 這個詞個人覺得不好理解. 我個人把 「archive」 叫做 「打包」.

舉個例子,  比如有一堆毛巾,  每一條毛巾代表乙個檔案.    「compress」(壓縮)的意思就是把毛巾裡面的水擰乾, 達到壓縮的目的.  而」archive」(打包) 的意思就是把這些毛巾包成乙個大包, 便於運輸.     所以你可能想到了, 要運輸一堆這樣的毛巾可能有兩種方法: 第一種: 先把每條毛巾擰乾並折成方塊(壓縮), 再把這些方塊組合成乙個大包(打包).  第二種, 先把這些毛巾包成乙個大包(打包),  然後再把這個大包擰乾.    憑經驗你可能已經意識到, 前一種方法比較好處理, 而且壓縮比比較大.  後一種方法就弱一點了.

對了, 前一種就是先壓縮後打包的方式. 7z, zip 和rar等就是用的這種方法.   後一種就是先打包, 後壓縮的方法. 常見的tar.gz的檔案就是用這種方法的. 先用tar打包, 在用gz壓縮.

對於7z 我們再具體解釋一下 「壓縮」 和 「打包」 的概念.

7z 檔案格式嚴格的說是一種」打包」的格式,  它規定了打包的方法.   而」壓縮」的任務是由不同的演算法完成的.    「壓縮演算法」負責把毛巾裡的水擰乾. 具體來講就是把乙個檔案按照一定規則變小.  壓縮演算法一般只能處理單個檔案, 對於多個檔案, 只能單個檔案壓縮, 然後再打包.

(當然,前面也說到了, 第二種方法就是先把檔案打包, 然後再壓縮. tar.gz就是這樣的. tar工具就是簡單的把所有的檔案首尾相接, 變成乙個大檔案, 然後再用壓縮演算法一次壓縮的.  這個不是本文的討論物件, 所以以後就不提了.)

7z預設使用的是lzma壓縮演算法.   單個檔案會先用lzma壓縮演算法壓縮,  然後7z負責把壓縮過後的檔案打包.   (這個跟zip類似, zip檔案也是打包格式, 它預設使用deflate演算法壓縮.)  7z還支援封裝其他幾種壓縮演算法, 比如: lzma2, ppmd, bzip2和deflate.

這些壓縮演算法在7z裡面都有原始碼,  也不是本文要討論的重點.  我們將重點討論7z的打包格式. 就是介紹7z具體是怎樣把壓縮過後的檔案封裝打包的.  期間也會夾雜介紹其中一些演算法.  後面如果有時間, 我會再單獨介紹這些演算法的具體實現.

終於把前期準備介紹完了,   有點繁瑣.

大家多多支援

byneil

byneil.com

fromblog by neil,post7z檔案格式及其原始碼的分析

blog by neil,post

7Z原始碼分析 7z h

define k7zstartheadersize 0x20 define k7zsignaturesize 6 extern const byte k7zsignature k7zsignaturesize 檔案的開頭處定義了2個巨集,k7zstartheadersize 是7z檔案頭的大小 詳情...

leveldb原始碼分析之sst檔案格式

leveldb插入資料時,首先將資料插入memtable,當memtable資料量達到一定大小時,當前memtable賦值給immemtable 也是memtable型別,但是這個是唯讀的 然後產生乙個新的memtable用於後續的資料插入,immemtable將會把資料持久化到磁碟中。磁碟檔案是按...

python2 7讀取 7z壓縮的檔案

系統 ubuntu14.04 開發環境 python2.7 實現功能 讀取.7z壓縮資料夾中的所有檔案 使用第三方包 pylzma和py7zlib 注 pylzma包含py7zlib包,所以只需要安裝pylzma即可 pip install pylzma安裝和測試過程如下 由於博主並沒有找到該包的任...