這是7z文件格式及其源碼的分析系列的第五篇. 上一篇講到了7z文件壓縮流程。最近太忙了,很久沒更新,都快忘了寫到哪了。:)算法
這一篇就說說7z文件的尾頭的生成方式吧。 上一篇已經講了尾header的結構了。它其實就是記錄了壓縮文件詳細信息。加密
先看一個圖:blog
這是整個7z文件的結構。 最後面的綠色「尾文件頭」 就是咱們要說的目標。遞歸
第一, 最簡單的, 就是把尾文件頭的內容直接寫在後面, 不作任何處理。ip
這種方式最簡單,可是卻最不經常使用。 緣由是什麼。 咱們看上一篇中說到的尾文件頭的內容就知道了。 舉個簡單的例子, 比方說你要壓縮大量的文件,好比100個文件吧。 爲文件頭裏面就會有大量的空間用來存儲文件名,文件大小,文件時間等等。 一般這些信息不少,可是有個共同特色就是重複信息多。 咱們知道,對於這些簡單的文本信息,其可壓縮性很是強。 換句話說,這些信息的壓縮比特別大。 因而, 這就引出了,另外一種壓縮方式。get
第二, 把原始的尾header信息用lzma算法再壓縮一次。這樣能夠顯著的減小尾header的大小。尤爲是在大量文件的時候。源碼
咱們來看一個圖:博客
實際怎麼生成的呢。 這實際上是一個遞歸過程。class
尾文件頭壓縮的思路就是把原始的尾文件頭數據當作一個單獨的文件流來進行一次前面的壓縮過程。就是重複一次前面的7z的壓縮過程。 不過這一次只有一個文件,所以只劃分一個Folder. 並且壓縮方法是指定的LZMA。也就是說只有一個Coder參與。 固然,原始尾文件頭的內容可能有敏感信息。 好比裏面的文件名等等信息。所以,7z也提供能力在壓縮尾文件頭的時候同時加密它。 因此壓縮尾文件頭的時候若是選擇加密頭信息,則會加入AES Coder加密。密碼
因此實際尾header就是這樣存儲的,上面的 PH, 和HH。
用戶在壓縮7z文件的時候,能夠選擇是否加密文件, 而且能夠同時選擇是否加密文件頭。
若是用戶只加密文件,而不加密文件頭。 這樣的文件,雙擊直接用7z打開,能夠看到裏面的文件結構。文件詳細信息,可是不能解壓文件出來,除非有密碼。
若是同時選擇加密文件和文件頭。 雙擊這樣的文件,7z會直接提示請輸入密碼,不然連文件結構都看不見。 緣由就在這裏。 由於文件的結構信息也被加密了,沒有密碼,連文件頭都解壓不開。
這一點必zip文件先進, zip只支持文件內容加密。
不知道說清楚了沒。暫時就到這吧。歡迎你們訪問個人我的獨立博客:http://byNeil.com 你們若是有對7z有興趣,歡迎你們聯繫我,探討交流。
下一篇給你們介紹7z如何實現流式壓縮和解壓的, 以及其餘一些7z的trick。