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