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).