zlib
此條目翻譯品質不佳。 (2021年1月29日) |
zlib是一個用於資料壓縮的函式庫,由Jean-loup Gailly與Mark Adler開發,初版0.9版發布於1995年5月1日。zlib使用抽象化的DEFLATE演算法,最初是為libpng函式庫所設計,後來逐漸被許多其他軟體使用。此函式庫為自由軟體,使用zlib授權許可。
首次發布 | 0.9(1995年5月1日 | )
---|---|
當前版本 | 1.2.13(2022年10月13日 | )
源代碼庫 | |
編程語言 | C |
操作系統 | 跨平台 |
類型 | 數據壓縮 |
許可協議 | zlib授權 |
網站 | 官方網站: zlib.net 鏡像網站: http://www.gzip.org/zlib/(法国) http://zlib.ipinfo.de/(德国) |
功能
數據頭
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],包括:
- Linux核心:使用zlib以實作網路協定的壓縮、檔案系統的壓縮以及開機時解壓縮自身的核心。
- libpng,用於PNG圖形格式的一個實現,對bitmap數據規定了DEFLATE作為流壓縮方法。
- Apache:使用zlib實作http 1.1。
- OpenSSH、OpenSSL:以zlib達到最佳化加密網路傳輸。
- FFmpeg:以zlib讀寫Matroska等以DEFLATE演算法壓縮的多媒體串流格式。
- rsync:以zlib最佳化遠端同步時的傳輸。
- Subversion、Git和CVS等版本控制系統,使用zlib來壓縮和遠端倉庫的通訊流量。
- dpkg和RPM等包管理軟件:以zlib解壓縮RPM或者其他封包。
因為其代碼的可移植性、寬鬆的授權許可以及較小的內存占用,zlib在許多嵌入式設備中也有應用。
參見
參考資料
- ^ 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).
- ^ Gailly, Jean-loup; Adler, Mark, zlib Applications, 2002-04-18 [2009-01-18], (原始內容存檔於2019-06-10).