Het compressie-algoritme dat in zlib wordt gebruikt, is in wezen hetzelfde als dat in gzip en zip. Wat zijn gzip en zip? Hoe zijn ze verschillend en hoe zijn ze hetzelfde?
Korte vorm:
.zip
is een archiefformaat dat, meestal, gebruik maakt van de Deflate compressiemethode. Het .gz
gzip formaat is voor losse bestanden, ook gebruik makend van de Deflate compressie methode. Vaak wordt gzip gebruikt in combinatie met tar om een gecomprimeerd archief formaat te maken, .tar.gz
. De zlib library biedt Deflate compressie en decompressie code voor gebruik door zip, gzip, png (die de zlib wrapper gebruikt op deflate data), en vele andere applicaties.
Lange vorm:_
Het ZIP-formaat is ontwikkeld door Phil Katz als een open formaat met een open specificatie, waarbij zijn implementatie, PKZIP, shareware was. Het is een archiefformaat dat bestanden en hun mappenstructuur opslaat, waarbij elk bestand afzonderlijk wordt gecomprimeerd. Het bestandstype is .zip
. De bestanden, evenals de directory-structuur, kunnen optioneel worden versleuteld.
Het ZIP-formaat ondersteunt verschillende compressiemethoden:
0 - The file is stored (no compression)
1 - The file is Shrunk
2 - The file is Reduced with compression factor 1
3 - The file is Reduced with compression factor 2
4 - The file is Reduced with compression factor 3
5 - The file is Reduced with compression factor 4
6 - The file is Imploded
7 - Reserved for Tokenizing compression algorithm
8 - The file is Deflated
9 - Enhanced Deflating using Deflate64(tm)
10 - PKWARE Data Compression Library Imploding (old IBM TERSE)
11 - Reserved by PKWARE
12 - File is compressed using BZIP2 algorithm
13 - Reserved by PKWARE
14 - LZMA (EFS)
15 - Reserved by PKWARE
16 - Reserved by PKWARE
17 - Reserved by PKWARE
18 - File is compressed using IBM TERSE (new)
19 - IBM LZ77 z Architecture (PFS)
97 - WavPack compressed data
98 - PPMd version I, Rev 1
Methoden 1 tot en met 7 zijn historisch en worden niet gebruikt. Methoden 9 tot en met 98 zijn relatief recente toevoegingen, en worden in wisselend, kleinschalig gebruik. De enige methode die echt wijdverbreid gebruikt wordt in het ZIP formaat is methode 8, Deflate, en in mindere mate methode 0, die helemaal geen compressie is. Vrijwel elk .zip
bestand dat je in het wild tegenkomt zal uitsluitend methode 8 en 0 gebruiken, waarschijnlijk alleen methode 8. (Methode 8 heeft ook een manier om de data effectief op te slaan zonder compressie en relatief weinig expansie, en methode 0 kan niet gestreamd worden terwijl methode 8 dat wel kan).
De ISO/IEC 21320-1:2015 standaard voor bestandscontainers is een beperkt zipformaat, zoals gebruikt in Java archiefbestanden (.jar), Office Open XML bestanden (Microsoft Office .docx, .xlsx, .pptx), Office Document Format bestanden (.odt, .ods, .odp), en EPUB bestanden (.epub). Die norm beperkt de compressiemethoden tot 0 en 8, evenals andere beperkingen zoals geen encryptie of handtekeningen.
Rond 1990 schreef de Info-ZIP groep draagbare, vrije, open source implementaties van zip
en unzip
utilities, die compressie met het Deflate formaat ondersteunden, en decompressie van dat en de eerdere formaten. Dit breidde het gebruik van het .zip
formaat enorm uit.
In de vroege jaren 90 werd het gzip formaat ontwikkeld als een vervanging voor het Unix compress
hulpprogramma, afgeleid van de Deflate code in de Info-ZIP hulpprogramma's. Unix compress
was ontworpen om een enkel bestand of een enkele stroom te comprimeren, door een .Z
toe te voegen aan de bestandsnaam. compress
gebruikt het LZW compressie algoritme, dat destijds gepatenteerd was en waarvan het vrije gebruik werd betwist door de patenthouders. Hoewel sommige specifieke implementaties van Deflate gepatenteerd waren door Phil Katz, was het formaat dat niet, en dus was het mogelijk om een Deflate implementatie te schrijven die geen patenten schond. Die implementatie is in de laatste 20 jaar niet meer zo aangevochten. De Unix gzip
utility was bedoeld als een drop-in vervanging voor compress
, en is in feite in staat om compress
-gecomprimeerde gegevens te decomprimeren (aannemend dat u in staat was om die zin te ontcijferen). gzip
voegt een .gz
toe aan de bestandsnaam. gzip
gebruikt het Deflate gecomprimeerde dataformaat, dat een stuk beter comprimeert dan Unix compress
, zeer snelle decompressie heeft, en een CRC-32 toevoegt als integriteitscontrole voor de data. Het header formaat laat ook toe om meer informatie op te slaan dan het compress
formaat toelaat, zoals de originele bestandsnaam en de tijd van wijziging van het bestand.
Hoewel compress
slechts een enkel bestand comprimeert, was het gebruikelijk om de tar
utility te gebruiken om een archief van bestanden, hun attributen, en hun directory structuur in een enkel .tar
bestand te maken, en dit dan te comprimeren met compress
om een .tar.Z
bestand te maken. In feite had en heeft de tar
utility een optie om de compressie tegelijkertijd te doen, in plaats van de uitvoer van tar
naar compress
te moeten leiden. Dit ging allemaal door naar het gzip formaat, en tar
heeft een optie om direct te comprimeren naar het .tar.gz
formaat. Het tar.gz
formaat comprimeert beter dan de .zip
aanpak, omdat de compressie van een .tar
voordeel kan halen uit redundantie in bestanden, vooral veel kleine bestanden. .tar.gz
is het meest gebruikte archiefformaat op Unix vanwege de zeer hoge portabiliteit, maar er zijn ook effectievere compressiemethoden in gebruik, dus je zult vaak .tar.bz2
en .tar.xz
archieven zien.
In tegenstelling tot .tar
, heeft .zip
een centrale directory aan het eind, die een lijst van de inhoud geeft. Dat en de aparte compressie geeft willekeurige toegang tot de individuele entries in een .zip
bestand. Een .tar
bestand zou gedecomprimeerd moeten worden en van begin tot eind gescand moeten worden om een directory op te bouwen, wat is hoe een .tar
bestand in een lijst staat.
Kort na de introductie van gzip, rond het midden van de jaren 90, stelde hetzelfde octrooigeschil het vrije gebruik van het .gif
afbeeldingsformaat ter discussie, zeer wijdverbreid gebruikt op bulletin boards en het World Wide Web (een nieuw ding in die tijd). Dus creëerde een kleine groep het PNG verliesvrij gecomprimeerde afbeeldingsformaat, met bestandstype .png
, om .gif
te vervangen. Dat formaat gebruikt ook het Deflate formaat voor compressie, dat wordt toegepast nadat filters op de afbeeldingsgegevens meer van de redundantie hebben blootgelegd. Om het wijdverbreide gebruik van het PNG formaat te bevorderen, zijn er twee gratis code bibliotheken gemaakt. libpng en zlib. libpng behandelde alle kenmerken van het PNG formaat, en zlib leverde de compressie en decompressie code voor gebruik door libpng, en voor andere toepassingen. zlib werd aangepast van de gzip
code.
Alle genoemde patenten zijn inmiddels verlopen.
De zlib bibliotheek ondersteunt Deflate compressie en decompressie, en drie soorten wrapping rond de deflate streams. Dat zijn: helemaal geen wrapping ("raw" deflate), zlib wrapping, die wordt gebruikt in de gegevensblokken van het PNG formaat, en gzip wrapping, om de programmeur gzip routines aan te bieden. Het belangrijkste verschil tussen zlib en gzip wrapping is dat de zlib wrapping compacter is, zes bytes tegenover minimaal 18 bytes voor gzip, en dat de integriteitscontrole, Adler-32, sneller werkt dan de CRC-32 die gzip gebruikt. Raw deflate wordt gebruikt door programma's die het .zip
formaat lezen en schrijven, wat een ander formaat is dat om deflate gecomprimeerde gegevens wikkelt.
zlib wordt nu veel gebruikt voor gegevensoverdracht en -opslag. Bijvoorbeeld, de meeste HTTP transacties door servers en browsers comprimeren en decomprimeren de gegevens met zlib.
Verschillende implementaties van deflate kunnen resulteren in verschillende gecomprimeerde output voor dezelfde invoergegevens, zoals blijkt uit het bestaan van selecteerbare compressieniveaus die het mogelijk maken de effectiviteit van de compressie af te wegen tegen de CPU-tijd. zlib en PKZIP zijn niet de enige implementaties van deflate-compressie en -decompressie. Zowel het 7-Zip archiveringshulpprogramma als Google's zopfli library hebben de mogelijkheid om veel meer CPU-tijd te gebruiken dan zlib om de laatste paar bits eruit te persen die mogelijk zijn bij gebruik van het deflate formaat, waardoor de gecomprimeerde maten met een paar procent worden verminderd in vergelijking met zlib's hoogste compressieniveau. Het pigz-hulpprogramma, een parallelle implementatie van gzip, bevat de optie om zlib (compressieniveaus 1-9) of zopfli (compressieniveau 11) te gebruiken, en verzacht enigszins de tijdsimpact van het gebruik van zopfli door de compressie van grote bestanden over meerdere processors en cores te verdelen.
ZIP is een bestandsformaat dat wordt gebruikt om een willekeurig aantal bestanden en mappen samen op te slaan met verliesloze compressie. Het maakt geen strikte veronderstellingen over de gebruikte compressiemethoden, maar wordt het vaakst gebruikt met DEFLATE.
Gzip is zowel een compressie-algoritme gebaseerd op DEFLATE maar minder bezwaard met mogelijke patenten et al, als een bestandsformaat voor het opslaan van een enkel gecomprimeerd bestand. Het ondersteunt het comprimeren van een willekeurig aantal bestanden en mappen wanneer het gecombineerd wordt met tar. Het resulterende bestand heeft een extensie van .tgz
of .tar.gz
en wordt gewoonlijk een tarball genoemd.
zlib is een bibliotheek van functies die DEFLATE in zijn meest voorkomende LZ77 incarnatie inkapselt.
Het belangrijkste verschil is dat gzip slechts in staat is om een enkel bestand te comprimeren, terwijl zip meerdere bestanden een voor een comprimeert en ze daarna archiveert in een enkel bestand. Daarom wordt gzip meestal samen met tar gebruikt (er zijn echter ook andere mogelijkheden). Dit gaat gepaard met enkele (on)voordelen.
Als je een groot archief hebt en je hebt er maar een enkel bestand uit nodig, dan moet je het hele gzip bestand decomprimeren om bij dat bestand te komen. Dit is niet nodig als je een zip-bestand hebt.
Anderzijds, als je 10 gelijkaardige of zelfs identieke bestanden comprimeert, zal het zip-archief veel groter zijn omdat elk bestand afzonderlijk wordt gecomprimeerd, terwijl in gzip in combinatie met tar één enkel bestand wordt gecomprimeerd, wat veel effectiever is als de bestanden gelijkaardig (gelijk) zijn.