close

DEFLATE 是同時使用了 LZ77 演算法與哈夫曼編碼的一個無損數據壓縮演算法。它最初是由 Phil Katz 為他的 PKZIP 歸檔工具第二版所定義的,後來定義在 RFC1951 規範中。

人們普遍認為 DEFLATE 不受任何專利所制約,並且在 LZW(GIF 文件格式使用)相關的專利失效之前,這種格式除了在 ZIP 文件格式中得到應用之外也在 gzip 壓縮文件以及 PNG 圖像文件中得到了應用。

DEFLATE 壓縮與解壓的原始碼可以在自由、通用的壓縮庫 zlib 上找到。

更高壓縮率的 DEFLATE 是 7-zip 所實現的。AdvanceCOMP 也使用這種實現,它可以對 gzip、PNG、MNG 以及 ZIP 文件進行壓縮從而得到比 zlib 更小的文件大小。在 Ken Silverman 的 KZIP 與 PNGOUT 中使用了一種更加高效同時要求更多用戶輸入的 DEFLATE 程序。

文章轉載至 維基百科

 

Deflate(有放氣、縮小的意思)是一種結合了 LZ77 演算法和霍夫曼(Huffman)編碼的無耗損資料壓縮演算法。它最初是由 Phil Katz 為了他的 PKZIP 壓縮工具版本2所研發的,後來也被定義在 RFC 1951 規格文件裡。一般認為 Deflate 是不受專利限制的,而且在 LZW 相關專利失效之前(使用在GIF檔案格式),除了 Katz 原先設計用在 ZIP 檔案格式之外,它也已經應用在 gzip 壓縮檔和 PNG 影像檔上。

串流格式

一個 Deflate 串流是由連續的區塊所組成。每個區塊之前有一個3位元的標頭:

1位元:串流標記最後一個區塊
1:串流最後一個區塊
0:後面還有區塊要執行
2位元:區塊類型編碼方式
00:後面是已儲存/原生/文字區塊,長度介於 0-65535 個位元組
01:靜態霍夫曼壓縮區塊,使用預定霍夫曼樹
10:使用霍夫曼表壓縮區塊
11:保留,不使用

大部分的區塊都是以編碼10—動態霍夫曼編碼—的方式作為結束,能夠依照每個個別資料的區塊產生最佳化的霍夫曼樹。而產生所需要的霍夫曼樹的指令則會立刻接在標頭之後。

兩個步驟完成壓縮
匹配和替換重複的指標字串。
以新符號替換舊符號,依據使用頻率加權符號。

消除重複字串

在壓縮區塊裡,如果有一個重複的連續位元組被發現了(一個重複字串),此時會插入一個後方參照,連結至前一個相同字串的所在位置作為替代。一個連結至前字串的編碼匹配依其長度(3-258 位元組)和距離(1-32768 位元組)所組成。相對後方參照可以使用在任何區塊沒有數量限制,只要區塊距離在未壓縮編碼資料最後32kB範圍之內就可以了(叫做移動窗口)。

位元壓縮

壓縮第二階段就是以較短的表示法來取代常用符號,以較長的表示法來取代不常用的符號。使用的霍夫曼編碼能夠建立一個沒有重疊間隔的無前綴樹狀結構,使得每個佇列長度和可能需要編碼的符號成反比。愈可能需要編碼的符號,它的位元佇列就越短。

樹狀結構包含空白共有288個符號:

0-255:表示文字位元元組/符號 0-255
256:區塊結尾,如果是最後一個區塊那就停止執行,否則繼續處理下一個區塊
257-285:結合額外位元,匹配長度 3-258 個位元組
286、287:保留不使用但是仍屬樹狀結構一部份

一個匹配長度碼會接在距離碼之後,一旦距離碼被讀取,那麼「額外」位元也可能被讀取以便產生最後的距離。距離樹狀結構包含空白有32個符號:

0-3:距離 1-4
4-5:距離 5-8,1 個額外位元
6-7:距離 9-16,2 個額外位元
8-9:距離 17-32,3 個額外位元
9-25:依此類推
26-27:距離 8193-16384,12 個額外位元
28-29:距離 16385-32768,13 個額外位元
30-31:保留不使用但是仍屬樹狀結構一部份

注意匹配距離符號 2-29,額外位元數可以以 n/2-1 來計算。

編碼 / 壓縮

在壓縮階段期間,編碼器會決定要花多少時間來搜尋匹配字串。zlib/gzip 的參照實作(reference implementation)能夠讓使用者選擇是要從多個壓縮級別裡選擇一個壓縮等級還是以壓縮速度優先考量。選項範圍從-0(不壓縮,直接儲存)至 -9 展現了在 zlib/gzip 中最大的參照實作能力。

當然也有其它的 Deflate 編碼器,它們也都會產生一個相容的位元串流,使得任何的 Deflate 解碼器都能進行解壓縮。 不同的實作可能會在最後產生的編碼位元串流造成不同的變化。一個非 zlib 版的編碼器其重點通常在於產生一個檔案小又有壓縮效率的編碼串流。

Deflate64/加強型 Deflate

Deflate64 是 PKZIP 2.5及其之後版本裡一個未公開的擴充協定及專利。變數(variant)使用一個 16 位元長度碼(匹配長度 3-65538 位元)和 14 位元距離碼(30-31)的漸增 64KB 字典。

在新軟體使用 Deflate

在很多程式語言裡都可以看到 Deflate 的實作應用。在 C 程式語言裡通常使用 zlib 程式庫(在舊有的 BSD 無廣告條款授權之下),使用 Borland 的 Pascal 程式語言撰寫程式則可以使用 paszlib,它是一個被包含在 7-Zip/AdvanceCOMP裡的一個 C++ 程式庫。Java 則已經包含在標準程式庫裡了(java.util.zip),微軟的 .NET Framework 2.0 則在類別程式庫裡的 System.IO.Compression 命名空間提供了支援。

解碼/解壓縮

Inflate(有充氣、膨脹的意思)是解壓縮時將 Deflate 位元串流解碼的一種程序,能夠正確的還原原始資料和檔案。

只實作 Inflate
只實作 Inflate 通常的目的是為了高度最佳化的解碼速度,或者因應微電腦控制內嵌系統可想而知的高記憶體使用量。

資料來源 維基百科(英) 翻譯 克里西熊

arrow
arrow
    全站熱搜

    ALVIN 發表在 痞客邦 留言(0) 人氣()