7z文件格式及其源碼的分析(五)


這是7z文件格式及其源碼的分析系列的第五篇. 上一篇講到了7z文件壓縮流程。最近太忙了,好久沒更新,都快忘了寫到哪了。:)

這一篇就說說7z文件的尾頭的生成方式吧。 上一篇已經講了尾header的結構了。它其實就是記錄了壓縮文件詳細信息。

那么尾header是如何存儲的呢?

先看一個圖:

1

這是整個7z文件的結構。  最后面的綠色“尾文件頭” 就是我們要說的目標。

7z的尾文件頭有兩種存儲方式。

第一,  最簡單的, 就是把尾文件頭的內容直接寫在后面, 不做任何處理。

這種方式最簡單,但是卻最不常用。 原因是什么。 我們看上一篇中說到的尾文件頭的內容就知道了。 舉個簡單的例子, 比方說你要壓縮大量的文件,比如100個文件吧。 為文件頭里面就會有大量的空間用來存儲文件名,文件大小,文件時間等等。  通常這些信息很多,但是有個共同特點就是重復信息多。 我們知道,對於這些簡單的文本信息,其可壓縮性非常強。 換句話說,這些信息的壓縮比特別大。  於是, 這就引出了,另一種壓縮方式。

第二, 把原始的尾header信息用lzma算法再壓縮一次。這樣可以顯著的減少尾header的大小。尤其是在大量文件的時候。

我們來看一個圖:

2

實際怎么生成的呢。 這其實是一個遞歸過程。

尾文件頭壓縮的思路就是把原始的尾文件頭數據當做一個單獨的文件流來進行一次前面的壓縮過程。就是重復一次前面的7z的壓縮過程。 不過這一次只有一個文件,因此只划分一個Folder. 而且壓縮方法是指定的LZMA。也就是說只有一個Coder參與。   當然,原始尾文件頭的內容可能有敏感信息。 比如里面的文件名等等信息。因此,7z也提供能力在壓縮尾文件頭的時候同時加密它。 所以壓縮尾文件頭的時候如果選擇加密頭信息,則會加入AES Coder加密。

3

 

所以實際尾header就是這樣存儲的,上面的 PH, 和HH。

 

用戶在壓縮7z文件的時候,可以選擇是否加密文件, 並且可以同時選擇是否加密文件頭。

如果用戶只加密文件,而不加密文件頭。 這樣的文件,雙擊直接用7z打開,可以看到里面的文件結構。文件詳細信息,但是不能解壓文件出來,除非有密碼。

如果同時選擇加密文件和文件頭。 雙擊這樣的文件,7z會直接提示請輸入密碼,否則連文件結構都看不見。 原因就在這里。 因為文件的結構信息也被加密了,沒有密碼,連文件頭都解壓不開。

這一點必zip文件先進, zip只支持文件內容加密。

不知道說清楚了沒。暫時就到這吧。歡迎大家訪問我的個人獨立博客:http://byNeil.com   大家如果有對7z有興趣,歡迎大家聯系我,探討交流。

下一篇給大家介紹7z如何實現流式壓縮和解壓的, 以及其他一些7z的trick。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM