先上圖
把要壓縮或要解壓的檔案拖拽到視窗中即可。另存為編輯框是壓縮或解壓的輸出路徑。對於壓縮來說,另存為路徑是目標檔案的路徑加上乙個.shc副檔名。對於解壓來說,會去掉最後乙個副檔名。
壓縮的核心其實就是用了哈夫曼編碼原理。我封裝了乙個哈夫曼編碼類,內部使用了乙個哈夫曼樹類。
要對乙個檔案進行壓縮,執行如下步驟:
1.建立編碼方案。第一遍掃瞄檔案,統計這個檔案中各種不同的位元組出現的次數(256種),以這個次數作為權值,建立對應的哈夫曼樹。然後取得每個不同位元組對應的01編碼序列。
2.計算壓縮後的大小,壓縮率。需要再次掃瞄檔案。由於我用記憶體檔案對映的方式來做壓縮,所以這一步必不可少,要先知道將要建立的壓縮檔案的大小。
3.執行編碼。執行編碼的話,要把原先的壓縮資訊寫入檔案的頭部。有乙個長1024位元組大小的表,這個表記錄了原先壓縮的檔案的每種位元組出現的次數。還有乙個4位元組的字段,這個字段記錄了壓縮檔案最後乙個位元組使用的位元位數。為什麼要記錄最後乙個位元組使用的位元位數呢?比如:a 對應01序列,b對應001序列,那麼ab壓縮後是:01001。對於乙個位元組來說,是有8位的,01001只使用了5位,還有3位未使用。
要對乙個檔案進行解壓,執行如下步驟:
1.讀取壓縮時寫入的檔案頭,也就是解壓資訊。重建原先的哈夫曼樹。設定乙個哈夫曼樹遊走指標指向樹根節點。
2.檔案遍歷指標越過檔案頭,指向壓縮資料起始位置,遍歷到檔案尾部。每遇到一位元組,還需要遍歷這個位元組的所有位。從其最高位向下遍歷,如果此位是0,那麼哈夫曼樹遊走指標就遊走左子樹路徑。如果此位是1,就遊走右子樹路徑。每次在哈夫曼樹中游走後,都要判斷下,是否走到了葉子節點。如果走到了葉子節點,就說明找到了解壓資訊,取出對應的葉子節點的資料資訊,寫入解壓檔案,並設定哈夫曼樹的遊走指標重新指向樹根節點。
ok,以上是壓縮和解壓步驟的概括說明。再補充一些細節。
怎麼對檔案進行編碼的呢?比如說"a"這個字母,其對應的ascii碼值是65吧。65對應的位元組二進位制數是:1000001。同理,"b"對應的二進位制數是:1000010。正常情況下,a和b在記憶體都占用了1位元組,ab同占用2位元組。
如果我們的哈夫曼編碼計算出:a對應的編碼為:01,b對應的編碼為001。那麼ab在一起就應該是01001,才占用了乙個位元組的5位嘛。這樣在原先的基礎上就節省出了1位元組零3位,當然,零頭3位在沒編碼占用的情況下,是沒用的。
由於,各種01序列編碼的長度都不一樣,所以,有可能乙個編碼會被位元組的大小隔開。我們知道的,乙個位元組是8位。假如a編碼為00001,b編碼為000001,那麼ab在一起的編碼就是:00001000001了。這樣子,乙個位元組是裝不下的,需要分2個位元組來裝,便是:00001000 001。第二個位元組只用了3位,剩下5位沒用。這時,你就需要設定乙個規定了,是前乙個位元組的高位接上後乙個位元組的低位,還是前乙個位元組的低位接上後乙個位元組的高位。我的選擇是後者,感覺比較直觀一些。
哈夫曼編碼檔案壓縮解壓
哈夫曼編碼檔案壓縮解壓 沒整懂這份 竟然只能壓縮文字檔案,而且內容不能包含中文,不能解壓大於 8 k 的zip壓縮檔案 還有就是如果使用哈夫曼編碼壓縮的內容重複率不高,壓縮的效果不明顯,如果內容的重複率高壓縮的效果好點 呼叫封裝 public static byte hufmanzip byte b...
哈夫曼樹和哈夫曼編碼(檔案壓縮)
哈夫曼樹 huffman tree 帶權路徑長度 wpl 設二叉樹有n個葉子結點,每個葉子結點帶有權值wk,從根節點到每個葉子結點的長度為lk,則每個葉子結點帶權路徑長度之和就是 wk lk 求和 最優二叉樹或哈夫曼樹 wpl最小的二叉樹 哈夫曼樹的構造 每次把權值最小的兩棵二叉樹合併 1 huff...
基於哈夫曼編碼完成的檔案壓縮及解壓
這幾天在較為認真的研究基於哈夫曼編碼的檔案壓縮及解壓,費了點時間,在這分享一下 這裡用鏈式結構,非順序表結構 檔案壓縮 1.獲取檔案資訊 這裡採用txt格式文字 2.壓縮檔案 3.寫配置檔案 便於解壓時用,無非就是存放原檔案的索引之類的,比如說,檔案中某個字元出現的個數,記錄下來 4.解壓縮,使用壓...