Ο αλγόριθμος συμπίεσης που χρησιμοποιείται στο zlib είναι ουσιαστικά ο ίδιος με αυτόν των gzip και zip. Τι είναι τα gzip και zip; Πώς διαφέρουν και πώς είναι ίδια;
Σύντομη μορφή:
Το .zip
είναι μια μορφή αρχείου που χρησιμοποιεί, συνήθως, τη μέθοδο συμπίεσης Deflate. Η μορφή gzip .gz
είναι για μεμονωμένα αρχεία, επίσης με τη μέθοδο συμπίεσης Deflate. Συχνά το gzip χρησιμοποιείται σε συνδυασμό με το tar για να δημιουργηθεί μια συμπιεσμένη μορφή αρχείου, .tar.gz
. Η βιβλιοθήκη zlib παρέχει κώδικα συμπίεσης και αποσυμπίεσης Deflate για χρήση από το zip, το gzip, το png (το οποίο χρησιμοποιεί το zlib wrapper στα δεδομένα deflate) και πολλές άλλες εφαρμογές.
Μακρά μορφή:
Η μορφή ZIP αναπτύχθηκε από τον Phil Katz ως ανοικτή μορφή με ανοικτές προδιαγραφές, όπου η εφαρμογή του, PKZIP, ήταν shareware. Πρόκειται για μια μορφή αρχείου που αποθηκεύει αρχεία και τη δομή των καταλόγων τους, όπου κάθε αρχείο συμπιέζεται ξεχωριστά. Ο τύπος αρχείου είναι .zip
. Τα αρχεία, καθώς και η δομή καταλόγου, μπορούν προαιρετικά να κρυπτογραφηθούν.
Η μορφή ZIP υποστηρίζει διάφορες μεθόδους συμπίεσης:
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
Οι μέθοδοι 1 έως 7 είναι ιστορικές και δεν χρησιμοποιούνται. Οι μέθοδοι 9 έως 98 είναι σχετικά πρόσφατες προσθήκες και χρησιμοποιούνται σε ποικίλες, μικρές ποσότητες. Η μόνη μέθοδος σε πραγματικά ευρεία χρήση στο φορμά ZIP είναι η μέθοδος 8, Deflate, και σε μικρότερο βαθμό η μέθοδος 0, η οποία δεν είναι καθόλου συμπίεση. Σχεδόν κάθε αρχείο .zip
που θα συναντήσετε στη φύση θα χρησιμοποιεί αποκλειστικά τις μεθόδους 8 και 0, πιθανότατα μόνο τη μέθοδο 8. (Η μέθοδος 8 έχει επίσης ένα μέσο για την αποτελεσματική αποθήκευση των δεδομένων χωρίς συμπίεση και με σχετικά μικρή επέκταση, και η μέθοδος 0 δεν μπορεί να γίνει streaming, ενώ η μέθοδος 8 μπορεί).
Το πρότυπο ISO/IEC 21320-1:2015 για τα εμπορευματοκιβώτια αρχείων είναι μια περιορισμένη μορφή zip, όπως αυτή που χρησιμοποιείται σε αρχεία αρχειοθέτησης Java (.jar), αρχεία Office Open XML (Microsoft Office .docx, .xlsx, .pptx), αρχεία Office Document Format (.odt, .ods, .odp) και αρχεία EPUB (.epub). Το εν λόγω πρότυπο περιορίζει τις μεθόδους συμπίεσης σε 0 και 8, καθώς και άλλους περιορισμούς, όπως η μη κρυπτογράφηση ή οι υπογραφές.
Γύρω στο 1990, η ομάδα Info-ZIP έγραψε φορητές, ελεύθερες, ανοιχτού κώδικα υλοποιήσεις των βοηθητικών προγραμμάτων zip
και unzip
, υποστηρίζοντας τη συμπίεση με τη μορφή Deflate και την αποσυμπίεση αυτής και των προηγούμενων μορφών. Αυτό επέκτεινε σημαντικά τη χρήση της μορφής .zip
.
Στις αρχές της δεκαετίας του 90's, αναπτύχθηκε η μορφή gzip ως αντικατάσταση του βοηθητικού προγράμματος Unix compress
, το οποίο προήλθε από τον κώδικα Deflate των βοηθητικών προγραμμάτων Info-ZIP. Το Unix compress
σχεδιάστηκε για να συμπιέζει ένα μεμονωμένο αρχείο ή ροή, προσθέτοντας ένα .Z
στο όνομα του αρχείου. Το compress
χρησιμοποιεί τον αλγόριθμο συμπίεσης LZW, ο οποίος εκείνη την εποχή ήταν υπό καθεστώς πατέντας και η ελεύθερη χρήση του ήταν υπό αμφισβήτηση από τους κατόχους της πατέντας. Αν και κάποιες συγκεκριμένες υλοποιήσεις του Deflate είχαν κατοχυρωθεί με δίπλωμα ευρεσιτεχνίας από τον Phil Katz, η μορφή δεν είχε κατοχυρωθεί, και έτσι ήταν δυνατό να γραφτεί μια υλοποίηση του Deflate που δεν παραβίαζε κανένα δίπλωμα ευρεσιτεχνίας. Αυτή η εφαρμογή δεν έχει αμφισβητηθεί τα τελευταία 20+ χρόνια. Το βοηθητικό πρόγραμμα Unix gzip
προοριζόταν ως αντικαταστάτης του compress
, και στην πραγματικότητα είναι σε θέση να αποσυμπιέσει τα συμπιεσμένα με compress
δεδομένα (υποθέτοντας ότι καταφέρατε να αναλύσετε αυτή την πρόταση). Το gzip
προσθέτει ένα .gz
στο όνομα του αρχείου. Το gzip
χρησιμοποιεί τη μορφή συμπιεσμένων δεδομένων Deflate, η οποία συμπιέζει αρκετά καλύτερα από το compress
του Unix, έχει πολύ γρήγορη αποσυμπίεση και προσθέτει ένα CRC-32 ως έλεγχο ακεραιότητας των δεδομένων. Η μορφή κεφαλίδας επιτρέπει επίσης την αποθήκευση περισσότερων πληροφοριών από ό,τι επιτρέπει η μορφή compress
, όπως το αρχικό όνομα του αρχείου και ο χρόνος τροποποίησης του αρχείου.
Αν και το compress
συμπιέζει μόνο ένα αρχείο, ήταν σύνηθες να χρησιμοποιείται το βοηθητικό πρόγραμμα tar
για να δημιουργηθεί ένα αρχείο αρχείων, τα χαρακτηριστικά τους και η δομή των καταλόγων τους σε ένα ενιαίο αρχείο .tar
και στη συνέχεια να συμπιεστεί με το compress
για να δημιουργηθεί ένα αρχείο .tar.Z
. Στην πραγματικότητα, το βοηθητικό πρόγραμμα tar
είχε και εξακολουθεί να έχει μια επιλογή για να κάνει τη συμπίεση ταυτόχρονα, αντί να χρειάζεται να διοχετεύει την έξοδο του tar
στο compress
. Όλα αυτά μεταφέρθηκαν στη μορφή gzip, και το tar
έχει μια επιλογή να συμπιέζει απευθείας στη μορφή .tar.gz
. Η μορφή tar.gz
συμπιέζει καλύτερα από την προσέγγιση .zip
, καθώς η συμπίεση ενός .tar
μπορεί να εκμεταλλευτεί τον πλεονασμό σε όλα τα αρχεία, ειδικά σε πολλά μικρά αρχεία. Η μορφή αρχείου .tar.gz
είναι η πιο συνηθισμένη μορφή αρχείου που χρησιμοποιείται στο Unix λόγω της πολύ υψηλής φορητότητάς της, αλλά υπάρχουν και πιο αποτελεσματικές μέθοδοι συμπίεσης που χρησιμοποιούνται επίσης, έτσι θα δείτε συχνά αρχεία .tar.bz2
και .tar.xz
.
Σε αντίθεση με το .tar
, το .zip
έχει έναν κεντρικό κατάλογο στο τέλος, ο οποίος παρέχει μια λίστα με τα περιεχόμενα. Αυτό και η ξεχωριστή συμπίεση παρέχει τυχαία πρόσβαση στις επιμέρους καταχωρήσεις ενός αρχείου .zip
. Ένα αρχείο .tar
θα έπρεπε να αποσυμπιεστεί και να σαρωθεί από την αρχή μέχρι το τέλος, προκειμένου να δημιουργηθεί ένας κατάλογος, με τον οποίο ένα αρχείο .tar
παρατίθεται σε λίστα.
Λίγο μετά την εισαγωγή του gzip, γύρω στα μέσα της δεκαετίας του 1990, η ίδια διαμάχη για την πατέντα έθεσε υπό αμφισβήτηση την ελεύθερη χρήση του μορφότυπου εικόνας .gif
, που χρησιμοποιούνταν ευρέως στους πίνακες ανακοινώσεων και στον Παγκόσμιο Ιστό (κάτι νέο τότε). Έτσι, μια μικρή ομάδα δημιούργησε τη μορφή εικόνας PNG με συμπίεση χωρίς απώλειες, με τύπο αρχείου .png
, για να αντικαταστήσει το .gif
. Αυτή η μορφή χρησιμοποιεί επίσης τη μορφή Deflate για συμπίεση, η οποία εφαρμόζεται αφού τα φίλτρα στα δεδομένα της εικόνας εκθέσουν περισσότερο από τον πλεονασμό. Προκειμένου να προωθηθεί η ευρεία χρήση της μορφής PNG, δημιουργήθηκαν δύο δωρεάν βιβλιοθήκες κώδικα. libpng και zlib. Η libpng χειριζόταν όλα τα χαρακτηριστικά της μορφής PNG, ενώ η zlib παρείχε τον κώδικα συμπίεσης και αποσυμπίεσης για χρήση από τη libpng, καθώς και για άλλες εφαρμογές. η zlib προσαρμόστηκε από τον κώδικα gzip
.
Όλες οι αναφερόμενες πατέντες έχουν πλέον λήξει.
Η βιβλιοθήκη zlib υποστηρίζει συμπίεση και αποσυμπίεση Deflate και τρία είδη περιτύλιξης γύρω από τις ροές deflate. Αυτά είναι: καθόλου περιτύλιγμα ("raw" deflate), zlib wrapping, το οποίο χρησιμοποιείται στα μπλοκ δεδομένων της μορφής PNG, και gzip wrapping, για την παροχή ρουτινών gzip για τον προγραμματιστή. Η κύρια διαφορά μεταξύ του zlib και του gzip wrapping είναι ότι το zlib wrapping είναι πιο συμπαγές, έξι bytes έναντι τουλάχιστον 18 bytes για το gzip, και ο έλεγχος ακεραιότητας, Adler-32, εκτελείται ταχύτερα από τον CRC-32 που χρησιμοποιεί το gzip. Το ακατέργαστο deflate χρησιμοποιείται από προγράμματα που διαβάζουν και γράφουν τη μορφή .zip
, η οποία είναι μια άλλη μορφή που περιτυλίγει τα συμπιεσμένα δεδομένα με deflate.
Το zlib χρησιμοποιείται πλέον ευρέως για τη μετάδοση και την αποθήκευση δεδομένων. Για παράδειγμα, οι περισσότερες συναλλαγές HTTP από διακομιστές και προγράμματα περιήγησης συμπιέζουν και αποσυμπιέζουν τα δεδομένα χρησιμοποιώντας το zlib.
Διαφορετικές υλοποιήσεις του deflate μπορούν να οδηγήσουν σε διαφορετική συμπιεσμένη έξοδο για τα ίδια δεδομένα εισόδου, όπως αποδεικνύεται από την ύπαρξη επιλέξιμων επιπέδων συμπίεσης που επιτρέπουν την ανταλλαγή της αποτελεσματικότητας της συμπίεσης με το χρόνο της CPU. zlib και PKZIP δεν είναι οι μόνες υλοποιήσεις συμπίεσης και αποσυμπίεσης του deflate. Τόσο το 7-Zip archiving utility όσο και η zopfli library της Google's έχουν τη δυνατότητα να χρησιμοποιούν πολύ περισσότερο χρόνο CPU από το zlib προκειμένου να αποσπάσουν τα τελευταία δυνατά bits όταν χρησιμοποιούν τη μορφή deflate, μειώνοντας τα συμπιεσμένα μεγέθη κατά μερικά τοις εκατό σε σύγκριση με το υψηλότερο επίπεδο συμπίεσης του zlib's. Το pigz utility, μια παράλληλη υλοποίηση του gzip, περιλαμβάνει την επιλογή χρήσης του zlib (επίπεδα συμπίεσης 1-9) ή του zopfli (επίπεδο συμπίεσης 11), και μετριάζει κάπως τις επιπτώσεις στο χρόνο από τη χρήση του zopfli, κατανέμοντας τη συμπίεση μεγάλων αρχείων σε πολλούς επεξεργαστές και πυρήνες.
ZIP είναι μια μορφή αρχείου που χρησιμοποιείται για την αποθήκευση ενός αυθαίρετου αριθμού αρχείων και φακέλων μαζί με συμπίεση χωρίς απώλειες. Δεν κάνει αυστηρές υποθέσεις σχετικά με τις μεθόδους συμπίεσης που χρησιμοποιούνται, αλλά χρησιμοποιείται συχνότερα με το DEFLATE.
Το Gzip είναι τόσο ένας αλγόριθμος συμπίεσης βασισμένος στο DEFLATE αλλά λιγότερο επιβαρυμένος με πιθανές πατέντες κ.ά., όσο και μια μορφή αρχείου για την αποθήκευση ενός μόνο συμπιεσμένου αρχείου. Υποστηρίζει τη συμπίεση αυθαίρετου αριθμού αρχείων και φακέλων όταν συνδυάζεται με το tar. Το αρχείο που προκύπτει έχει επέκταση .tgz
ή .tar.gz
και συνήθως ονομάζεται tarball.
Το zlib είναι μια βιβλιοθήκη συναρτήσεων που ενθυλακώνει το DEFLATE στην πιο συνηθισμένη εκδοχή του LZ77.
Η πιο σημαντική διαφορά είναι ότι το gzip μπορεί να συμπιέσει μόνο ένα αρχείο, ενώ το zip συμπιέζει πολλά αρχεία ένα προς ένα και τα αρχειοθετεί σε ένα ενιαίο αρχείο στη συνέχεια. Έτσι, το gzip συνοδεύεται τις περισσότερες φορές από το tar (υπάρχουν όμως και άλλες δυνατότητες). Αυτό συνοδεύεται από κάποια (δυσ)πλεονεκτήματα.
Αν έχετε ένα μεγάλο αρχείο και χρειάζεστε μόνο ένα αρχείο από αυτό, πρέπει να αποσυμπιέσετε ολόκληρο το αρχείο gzip για να φτάσετε σε αυτό το αρχείο. Αυτό δεν απαιτείται αν έχετε ένα αρχείο zip.
Από την άλλη πλευρά, αν συμπιέσετε 10 όμοια ή ακόμα και ίδια αρχεία, το αρχείο zip θα είναι πολύ μεγαλύτερο επειδή κάθε αρχείο συμπιέζεται ξεχωριστά, ενώ στο gzip σε συνδυασμό με το tar συμπιέζεται ένα μόνο αρχείο το οποίο είναι πολύ πιο αποτελεσματικό αν τα αρχεία είναι όμοια (ίσα).