Come sono correlati zlib, gzip e zip? Cosa hanno in comune e in che cosa differiscono?


948

L'algoritmo di compressione utilizzato in zlib è essenzialmente lo stesso di gzip e zip . Cosa sono gzip e zip ? Come sono diversi e come sono uguali?

Risposte:


2476

Forma breve:

.zipè un formato di archivio che utilizza, di solito, il metodo di compressione Deflate . Il .gzformato gzip è per file singoli, anche usando il metodo di compressione Deflate. Spesso gzip viene usato in combinazione con il catrame per fare un formato di archivio compresso , .tar.gz. La libreria zlib fornisce il codice di compressione e decompressione Deflate per l'uso da zip, gzip, png (che utilizza il wrapper zlib per deflate i dati) e molte altre applicazioni.

Forma lunga:

Il formato ZIP è stato sviluppato da Phil Katz come formato aperto con una specifica aperta, in cui la sua implementazione, PKZIP, era shareware. È un formato di archivio che memorizza i file e la loro struttura di directory, in cui ogni file viene compresso individualmente. Il tipo di file è .zip. I file, nonché la struttura delle directory, possono essere facoltativamente crittografati.

Il formato ZIP supporta diversi metodi di compressione:

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

I metodi da 1 a 7 sono storici e non sono in uso. I metodi da 9 a 98 sono aggiunte relativamente recenti e possono variare in piccole quantità di utilizzo. L'unico metodo di uso veramente diffuso nel formato ZIP è il metodo 8, Deflate e, in misura minore, il metodo 0, che non è affatto compressione. Praticamente ogni .zipfile che incontrerai in natura utilizzerà esclusivamente i metodi 8 e 0, probabilmente solo il metodo 8. (Il metodo 8 ha anche un mezzo per archiviare efficacemente i dati senza compressione e relativamente poca espansione, e il metodo 0 non può essere trasmesso in streaming mentre il metodo 8 può essere.)

Lo standard ISO / IEC 21320-1: 2015 per i contenitori di file è un formato zip limitato, come quello utilizzato nei file di archivio Java (.jar), nei file Open XML di Office (Microsoft Office .docx, .xlsx, .pptx), Office Document Formattare file (.odt, .ods, .odp) e file EPUB (.epub). Tale standard limita i metodi di compressione a 0 e 8, nonché altri vincoli come nessuna crittografia o firma.

Intorno al 1990, il gruppo Info-ZIP ha scritto implementazioni portatili, gratuite, open source zipe unziputilità, supportando la compressione con il formato Deflate e la decompressione di questo e dei formati precedenti. Ciò ha notevolmente ampliato l'uso del .zipformato.

All'inizio degli anni '90, il formato gzip è stato sviluppato in sostituzione dell'utilità Unixcompress , derivata dal codice Deflate nelle utility Info-ZIP. Unix è compressstato progettato per comprimere un singolo file o flusso, aggiungendo .Za al nome del file. compressutilizza l' algoritmo di compressione LZW , che all'epoca era coperto da brevetto e il suo uso gratuito era contestato dai titolari dei brevetti. Sebbene alcune implementazioni specifiche di Deflate siano state brevettate da Phil Katz, il formato no, e quindi è stato possibile scrivere un'implementazione Deflate che non ha violato alcun brevetto. Tale attuazione non è stata messa a dura prova negli ultimi 20 anni. L' gziputilità Unix è stata intesa come sostituto drop-incompresse in effetti è in grado di decomprimere i compressdati compressi (supponendo che tu sia stato in grado di analizzare quella frase). gzipaggiunge .gza al nome del file. gzipusa il formato di dati compressi Deflate, che comprime un po 'meglio di Unix compress, ha una decompressione molto veloce e aggiunge un CRC-32 come controllo di integrità per i dati. Il formato dell'intestazione consente anche la memorizzazione di più informazioni rispetto al compressformato consentito, come il nome del file originale e il tempo di modifica del file.

Sebbene compresscomprime solo un singolo file, era comune utilizzare l' tarutilità per creare un archivio di file, i loro attributi e la loro struttura di directory in un singolo .tarfile e quindi comprimerlo compressper creare un .tar.Zfile. In effetti l' tarutilità aveva e ha ancora un'opzione per fare la compressione allo stesso tempo, invece di dover convogliare l'output di tara compress. Tutto ciò è stato portato al formato gzip e tarha un'opzione per comprimere direttamente nel .tar.gzformato. Il tar.gzformato si comprime meglio .zipdell'approccio, poiché la compressione di a .tarpuò sfruttare la ridondanza tra i file, in particolare molti file di piccole dimensioni. .tar.gzè il formato di archivio più comune in uso su Unix a causa della sua portabilità molto elevata, ma ci sono anche metodi di compressione più efficaci in uso, quindi spesso vedrai .tar.bz2e .tar.xzarchivi.

A differenza .tar, .zipha una directory centrale alla fine, che fornisce un elenco dei contenuti. Quello e la compressione separata forniscono accesso casuale alle singole voci in un .zipfile. Un .tarfile dovrebbe essere decompresso e scansionato dall'inizio alla fine per costruire una directory, che è come un .tarfile è elencato.

Poco dopo l'introduzione di gzip, verso la metà degli anni '90, la stessa disputa sui brevetti mise in discussione l'uso gratuito del .gifformato dell'immagine, molto usato nelle bacheche e nel World Wide Web (una novità all'epoca). Quindi un piccolo gruppo ha creato il formato immagine compresso senza perdita di dati PNG, con il tipo di file .png, per sostituirlo .gif. Tale formato utilizza anche il formato Deflate per la compressione, che viene applicato dopo che i filtri sui dati dell'immagine hanno rivelato una maggiore ridondanza. Al fine di promuovere un uso diffuso del formato PNG, sono state create due librerie di codici gratuiti. libpng e zlib. libpng ha gestito tutte le funzionalità del formato PNG e zlib ha fornito il codice di compressione e decompressione per l'uso da parte di libpng, nonché per altre applicazioni. zlib è stato adattato dal gzipcodice.

Tutti i brevetti citati sono scaduti.

La libreria zlib supporta la compressione e la decompressione Deflate e tre tipi di avvolgimento attorno ai flussi di deflazione. Questi sono: nessun wrapping (deflate "raw"), wrapping zlib , che viene utilizzato nei blocchi di dati in formato PNG e wrapping gzip, per fornire routine gzip per il programmatore. La differenza principale tra il wrapping di zlib e gzip è che il wrapping di zlib è più compatto, sei byte contro un minimo di 18 byte per gzip e il controllo di integrità, Adler-32, viene eseguito più velocemente del CRC-32 utilizzato da gzip. Deflate grezzo viene utilizzato dai programmi che leggono e scrivono il .zipformato, che è un altro formato che avvolge deflate i dati compressi.

zlib è ora ampiamente utilizzato per la trasmissione e l'archiviazione dei dati. Ad esempio, la maggior parte delle transazioni HTTP da server e browser comprime e decomprime i dati utilizzando zlib, in particolare l'intestazione HTTP Content-Encoding: deflatesignifica deflate il metodo di compressione racchiuso nel formato dati zlib .

Diverse implementazioni di deflate possono comportare output compressi diversi per gli stessi dati di input, come evidenziato dall'esistenza di livelli di compressione selezionabili che consentono di scambiare l'efficacia della compressione per il tempo della CPU. zlib e PKZIP non sono le uniche implementazioni di decompressione e decompressione. Sia l' utilità di archiviazione 7-Zip che la libreria zopfli di Google hanno la possibilità di utilizzare molto più tempo della CPU rispetto a zlib al fine di ridurre gli ultimi bit possibili quando si utilizza il formato di deflate, riducendo le dimensioni compresse di qualche percento rispetto al massimo di zlib livello di compressione. L' utilità pigz, un'implementazione parallela di gzip, include l'opzione di utilizzare zlib (livelli di compressione 1-9) o zopfli (livello di compressione 11) e in qualche modo mitiga l'impatto temporale dell'uso di zopfli suddividendo la compressione di file di grandi dimensioni su più processori e core.


113
Questo post è pieno di così tanta storia e informazione che credo che alcune citazioni debbano essere aggiunte nel caso in cui le persone provino a fare riferimento a questo post come fonte di informazioni. Tuttavia, se queste informazioni si riflettessero da qualche parte con citazioni come Wikipedia, sarebbe apprezzato un collegamento a lavori simili citati.
ThorSummoner,

1348
Sono il riferimento, essendo stato parte di tutto ciò. Questo post potrebbe essere citato in Wikipedia come fonte originale.
Mark Adler,

524
Cordiali saluti: Mark Adler è un ingegnere informatico americano ed è stato fortemente coinvolto nell'esplorazione dello spazio. È noto soprattutto per il suo lavoro nel campo della compressione dei dati come autore della funzione checksum Adler-32 e coautore della libreria di compressione zlib e gzip. Ha contribuito a Info-ZIP e ha partecipato allo sviluppo del formato immagine PNG (Portable Network Graphics). Adler è stato anche Spirit Mission Mission Manager per la missione Mars Exploration Rover. (wikipedia)
Isaac Hanson,

99
gzip è stato creato per sostituire Unix compress. zip non è superiore a tar + gzip su Unix, per diversi motivi. (Quando vedi i .tar.gzfile, ecco cosa sono.) In primo luogo, tar + gzip comprime meglio di zip, poiché la compressione del file successivo può usare la cronologia del file precedente (a volte indicato come un archivio "solido"). zip può comprimere i file solo individualmente. Secondo, tar conserva tutte le informazioni sulla directory di Unix, mentre zip non è stato progettato per farlo. (Le estensioni successive al formato zip con blocchi extra specifici di Unix tentano di porre rimedio a questo problema.)
Mark Adler,

85
Sembri confondere i formati con l'implementazione. L' implementazione 7-Zip del formato deflate può ottenere qualcosa come una compressione tra il 2% e il 10% migliore rispetto a gzip con lo stesso formato deflate (pur richiedendo molto più tempo della CPU per farlo). I 7z LZMA2 formato offerte dell'ordine del 40% di compressione migliore.
Mark Adler,

43

ZIP è un formato di file utilizzato per archiviare un numero arbitrario di file e cartelle insieme alla compressione senza perdita. Non fa ipotesi rigide sui metodi di compressione utilizzati, ma è più frequentemente utilizzato con DEFLATE .

Gzip è sia un algoritmo di compressione basato su DEFLATE ma meno gravato da potenziali brevetti e altri, sia un formato di file per la memorizzazione di un singolo file compresso. Supporta la compressione di un numero arbitrario di file e cartelle se combinato con tar . Il file risultante ha un'estensione di .tgzo .tar.gzed è comunemente chiamato tarball .

zlib è una libreria di funzioni che incapsulano DEFLATE nella sua incarnazione LZ77 più comune .


28

La differenza più importante è che gzip è in grado di comprimere un solo file mentre zip comprime più file uno per uno e li archivia in un singolo file in seguito. Pertanto, gzip arriva con tar la maggior parte del tempo (ci sono altre possibilità, però). Questo comporta alcuni (dis) vantaggi.

Se hai un grande archivio e ne hai bisogno solo di un singolo file, devi decomprimere l'intero file gzip per arrivare a quel file. Questo non è necessario se si dispone di un file zip.

D'altra parte, se comprimi 10 file simili o addirittura identici, l'archivio zip sarà molto più grande perché ogni file viene compresso individualmente, mentre in gzip in combinazione con tar viene compresso un singolo file che è molto più efficace se i file sono simile (uguale).


8
Stai esagerando il punto. Se le persone volessero archivi compressi ad accesso casuale, potrebbero creare file ".gz.tar" anziché ".tar.gz". Non lo fanno, perché la maggior parte delle persone non è così interessata all'accesso casuale. Esiste una grande comunità attorno al formato di archiviazione web .warc.gz e hanno bisogno di un accesso casuale, quindi comprimono ogni pagina web separatamente. Si utilizza questo formato ogni volta che si guarda una pagina Web nella Wayback Machine di Internet Archive.
Greg Lindahl,

2
".gz.tar" non offre l'accesso casuale poiché il formato tar non è in grado di accedere in modo casuale alle sue voci. È necessario esaminare tutte le voci dall'inizio per ottenere quella specifica desiderata, anche peggio: è necessario passare attraverso tutte le voci fino alla fine perché lo stesso file può essere archiviato più volte (in diverse versioni) in più posizioni nello stesso archivio - e non c'è modo di capirlo se non per leggere l'intera voce dell'archivio per voce.
Min-Soo Pipefeet,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.