zlib

DEFLATE編解碼器函式庫

zlib是一個用於資料壓縮函式庫,由Jean-loup Gailly與Mark Adler開發,初版0.9版發布於1995年5月1日。zlib使用抽象化DEFLATE演算法,最初是為libpng函式庫所設計,後來逐漸被許多其他軟體使用。此函式庫為自由軟體,使用zlib授權許可。

zlib
zlib logo
首次發布0.9(1995年5月1日,​29年前​(1995-05-01
當前版本1.2.13(2022年10月13日,​2年前​(2022-10-13
源代碼庫 編輯維基數據鏈接
編程語言C
操作系統跨平台
類型數據壓縮
許可協議zlib授權
網站官方網站:
zlib.net
鏡像網站:
http://www.gzip.org/zlib/(法国)
http://zlib.ipinfo.de/(德国)

截至2007年3月,zlib是包含在Coverity、由美國國土安全部贊助者選擇繼續審查的開源項目[1]

功能

數據頭

zlib在壓縮數據時支持使用gzip數據頭(header)、zlib數據頭或者不使用數據頭。通常情況下,數據壓縮使用zlib數據頭,因為它提供了錯誤數據檢測的功能。當數據不使用數據頭寫入時,由於沒有任何錯誤檢測的原始DEFLATE數據,那麼解壓縮的軟件將無法得知壓縮數據在什麼地方結束。

gzip數據頭比zlib數據頭要大,因為它保存了文件名和其他文件系統信息——事實上,這等同於廣泛使用的gzip文件的數據頭格式。注意zlib函式庫本身並不能創建一個gzip文件,但是它可以將壓縮數據寫入到一個現成的、具有gzip文件頭的文件中。

演算法

截至2018年9月,zlib僅支持一個LZ77的變種算法,即DEFLATE的算法。

這個算法使用的系統資源很少,並且對各種數據都能提供很好的壓縮效果。這種算法也由ZIP檔案所使用。(儘管zip文件格式也支持幾種其他的算法)。

zlib的數據頭理論上允許使用其他算法,但目前為止仍然只有這一種算法被使用。

使用資源

zlib提供了幫助控制CPU和內存資源使用的方法。通過設置不同的壓縮級別數值,即可改變壓縮率和壓縮速度。

除此之外,zlib還提供了內存管理的功能,以便於在諸如嵌入式系統等資源較為受限的環境中使用。

策略

zlib的壓縮算法可以針對特定類型的數據進行優化。

若使用者總是使用zlib壓縮特定類型的數據,則可以選擇有針對性的策略來提高壓縮效率和性能。例如,如果使用者的數據包含很長的重複數據,那麼可以用RLE(運行長度編碼)策略進行優化。

對於一般的數據,默認策略往往是最佳的。

錯誤處理

當採用zlib或gzip數據頭時,zlib可以檢測並跳過壓縮文件數據中的錯誤。

此外,如果全刷新點(full-flush points)被寫入到壓縮後的數據流中,那麼zlib可以跳過損壞的數據並繼續解壓縮,並重新同步到下個全刷新點。(儘管zlib並不能糾正錯誤並修復損壞的數據)。全刷新點技術對於在不可靠的傳輸途徑上的大數據流是很有用的,因為這種場景下丟失一些過去的數據很可能並沒有太大影響(比如一些多媒體應用場景)。然而,建立太多的全刷新點會極大地影響速度和壓縮率。

數據長度

zlib並沒有對於壓縮和解壓縮數據長度的限制,通過重複調用庫函數可以處理無限多的數據塊。一些輔助代碼(計數變量)可能會因此溢出,但是不影響實際的壓縮和解壓縮。當壓縮一個較長或是無限長數據流時,最好寫入全刷新點。

使用zlib的軟體

zlib已經成為了一種事實上的業界標準,以至於在標準文檔中,zlib和DEFLATE常常被互換使用。數以千計的應用程序直接或間接依靠zlib壓縮函式庫[2],包括:

因為其代碼的可移植性、寬鬆的授權許可以及較小的內存占用,zlib在許多嵌入式設備中也有應用。

參見

參考資料

  1. ^ Press release: Critical Open Source Software Projects Receive 6,000 Bug Fixes in First Year of Coverity Scan Site, Coverity, 2007-03-27 [2007-12-10], (原始內容存檔於2007-12-12) .
  2. ^ Gailly, Jean-loup; Adler, Mark, zlib Applications, 2002-04-18 [2009-01-18], (原始內容存檔於2019-06-10) .

外部連結