W jaki sposób powiązane są zlib, gzip i zip? Co mają ze sobą wspólnego i czym się różnią?

948

Algorytm kompresji używany w zlib jest zasadniczo taki sam jak w gzip i zip . Co to są gzip i zip ? Czym się różnią i jak są tacy sami?

Abhishek Jain
źródło

Odpowiedzi:

2476

Skrócona forma:

.zipjest formatem archiwalnym używającym zwykle metody kompresji Deflate . .gzFormacie gzip jest dla pojedynczych plików, a także przy użyciu metody kompresji Deflate. Gzip często stosowany jest w połączeniu ze smołą, aby formacie skompresowanym archiwum , .tar.gz. Biblioteka zlib zapewnia Deflate kompresji i dekompresji kodu do wykorzystania przez zip, gzip, png (który używa otoki zlib na DEFLATE danych), i wiele innych aplikacji.

Długa forma:

Formacie ZIP został opracowany przez Phil Katz w otwartym formacie z otwartą specyfikacją, gdzie jego wdrożenie, PKZIP został shareware. Jest to format archiwum, w którym przechowywane są pliki i ich struktura katalogów, gdzie każdy plik jest indywidualnie kompresowany. Typ pliku to .zip. Pliki oraz strukturę katalogów można opcjonalnie zaszyfrować.

Format ZIP obsługuje kilka metod kompresji:

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

Metody od 1 do 7 są historyczne i nie są używane. Metody od 9 do 98 są stosunkowo nowymi dodatkami i mają różne, niewielkie zastosowanie. Jedyną metodą, która jest naprawdę szeroko stosowana w formacie ZIP, jest metoda 8, Deflate , oraz w mniejszym stopniu metoda 0, która wcale nie jest kompresją. Praktycznie każdy .zipplik, na który natrafisz na wolności, będzie używał wyłącznie metod 8 i 0, prawdopodobnie tylko metody 8. (Metoda 8 ma również środki do skutecznego przechowywania danych bez kompresji i względnie niewielkiego rozszerzenia, a metoda 0 nie może być przesyłana strumieniowo podczas gdy metoda 8 może być.)

Standard ISO / IEC 21320-1: 2015 dla kontenerów plików jest ograniczonym formatem zip, takim jak używany w plikach archiwum Java (.jar), plikach Office Open XML (Microsoft Office .docx, .xlsx, .pptx), Office Document Formatuj pliki (.odt, .ods, .odp) i pliki EPUB (.epub). Ten standard ogranicza metody kompresji do 0 i 8, a także inne ograniczenia, takie jak brak szyfrowania lub podpisów.

Około 1990 r. Grupa Info-ZIP napisała przenośne, bezpłatne implementacje zipi unzipnarzędzia typu open source , obsługujące kompresję w formacie Deflate oraz dekompresję tego i wcześniejszych formatów. To znacznie rozszerzyło użycie tego .zipformatu.

Na początku lat 90. opracowano format gzip jako zamiennik narzędzia Unixcompress , pochodzącego z kodu Deflate w narzędziach Info-ZIP. Unix compresszostał zaprojektowany do kompresji pojedynczego pliku lub strumienia, dołączając .Zdo nazwy pliku. compresskorzysta z algorytmu kompresji LZW , który w tym czasie był patentowany, a jego swobodne korzystanie było kwestionowane przez posiadaczy patentu. Chociaż niektóre konkretne implementacje Deflate zostały opatentowane przez Phila Katza, format nie był, więc można było napisać implementację Deflate, która nie naruszała żadnych patentów. Wdrożenie nie było tak trudne od ponad 20 lat. Narzędzie Unix gzipmiało być zamiennikiemcompress, i w rzeczywistości jest w stanie dekompresować compressskompresowane dane (przy założeniu, że udało Ci się przeanalizować to zdanie). gzipdołącza a .gzdo nazwy pliku. gzipużywa skompresowanego formatu danych Deflate, który kompresuje się nieco lepiej niż Unix compress, ma bardzo szybką dekompresję i dodaje CRC-32 jako kontrolę integralności danych. Format nagłówka pozwala również na przechowywanie większej ilości informacji niż compressdozwolony format, takich jak oryginalna nazwa pliku i czas modyfikacji pliku.

Mimo że compresskompresuje tylko jeden plik, często używano tego tarnarzędzia do tworzenia archiwum plików, ich atrybutów i struktury katalogów w jednym .tarpliku, a następnie kompresowania go w compresscelu utworzenia .tar.Zpliku. W rzeczywistości tarnarzędzie miało i nadal ma opcję wykonania kompresji w tym samym czasie, zamiast konieczności przesyłania danych wyjściowych tardo compress. Wszystko to zostało przeniesione do formatu gzip i tarma opcję kompresji bezpośrednio do .tar.gzformatu. tar.gzFormat kompresuje lepiej niż .zippodejście, ponieważ ściskanie .tarmogą skorzystać z redundancją w plikach, szczególnie wiele małych plików. .tar.gzjest najpopularniejszym formatem archiwum używanym w Uniksie ze względu na jego bardzo dużą przenośność, ale istnieją również bardziej efektywne metody kompresji, więc często będziesz widzieć .tar.bz2i .tar.xzarchiwizujesz.

W przeciwieństwie do tego .tar, .zipma na końcu centralny katalog, który zawiera listę zawartości. To i osobna kompresja zapewnia losowy dostęp do poszczególnych wpisów w .zippliku. .tarPlik musiałby być rozpakowane i skanowane od początku do końca w celu stworzenia katalogu, który jest, jak .tarplik znajduje się na liście.

Krótko po wprowadzeniu gzip, około połowy lat 90., ten sam spór patentowy zakwestionował swobodne korzystanie z .gifformatu obrazu, bardzo szeroko stosowanego na tablicach ogłoszeń i w sieci WWW (wówczas coś nowego). Tak więc mała grupa utworzyła bezstratnie skompresowany format obrazu PNG z typem pliku .png, aby go zastąpić .gif. Ten format używa również formatu Deflate do kompresji, który jest stosowany po tym, jak filtry danych obrazu ujawniają większą nadmiarowość. Aby promować powszechne stosowanie formatu PNG, utworzono dwie bezpłatne biblioteki kodów. libpng i zlib. libpng obsługiwał wszystkie funkcje formatu PNG, a zlib zapewniał kod kompresji i dekompresji do użytku przez libpng, a także do innych aplikacji. zlib został zaadaptowany z gzipkodu.

Wszystkie wymienione patenty wygasły.

Biblioteka zlib obsługuje kompresję i dekompresję Deflate oraz trzy rodzaje owijania wokół strumieni deflate. Są to: brak owijania (deflacja „raw”), owijanie zlib , które jest używane w blokach danych w formacie PNG, i owijanie gzip, aby zapewnić programatorowi procedury gzip. Główna różnica między owijaniem zlib a gzip polega na tym, że owijanie zlib jest bardziej kompaktowe, sześć bajtów w porównaniu z minimum 18 bajtami dla gzip, a kontrola integralności, Adler-32, działa szybciej niż CRC-32, którego używa gzip. Raw deflate jest używany przez programy, które odczytują i zapisują .zipformat, który jest innym formatem, który otacza skompresowane dane.

Zlib jest obecnie szeroko stosowany do przesyłania i przechowywania danych. Na przykład większość transakcji HTTP dokonywanych przez serwery i przeglądarki kompresuje i dekompresuje dane przy użyciu zlib, w szczególności nagłówek HTTP Content-Encoding: deflateoznacza metodę kompresji deflate zawartą w formacie danych zlib .

Różne implementacje deflacji mogą powodować różne kompresowane dane wyjściowe dla tych samych danych wejściowych, o czym świadczy istnienie możliwych do wyboru poziomów kompresji, które pozwalają na kompromis w zakresie efektywności kompresji w odniesieniu do czasu procesora. Zlib i PKZIP nie są jedynymi implementacjami kompresji i dekompresji deflate. Zarówno narzędzie do archiwizacji 7-Zip, jak i biblioteka zopfli Google'a mogą zużywać znacznie więcej czasu procesora niż zlib, aby wycisnąć kilka ostatnich bitów możliwych przy użyciu formatu deflate, zmniejszając rozmiary skompresowane o kilka procent w porównaniu do najwyższego zlib poziom kompresji. Narzędzie Pigz, równoległa implementacja gzip, zawiera opcję użycia zlib (poziomy kompresji 1-9) lub zopfli (poziom kompresji 11) i nieco zmniejsza wpływ czasowy używania zopfli poprzez podział kompresji dużych plików na wiele procesorów i rdzeni.

Mark Adler
źródło
113
Ten post jest wypełniony tak dużą historią i informacjami, że wydaje mi się, że należy dodać kilka cytatów, ponieważ ludzie starają się odwoływać do tego postu jako źródła informacji. Chociaż jeśli informacje te znajdują odzwierciedlenie w cytatach takich jak Wikipedia, link do podobnej cytowanej pracy byłby mile widziany.
ThorSummoner,
1348
Jestem referencją, będąc częścią tego wszystkiego. Ten post może być cytowany w Wikipedii jako oryginalne źródło.
Mark Adler
524
FYI: Mark Adler jest amerykańskim inżynierem oprogramowania i był mocno zaangażowany w eksplorację kosmosu. Najbardziej znany jest ze swojej pracy w dziedzinie kompresji danych jako autor funkcji sumy kontrolnej Adler-32 oraz współautor biblioteki kompresji zlib i gzip. Współtworzył Info-ZIP i brał udział w opracowywaniu formatu obrazu Portable Network Graphics (PNG). Adler był także Kierownikiem misji Cruise Spirit w misji Mars Exploration Rover. (wikipedia)
Isaac Hanson
99
gzip został stworzony, aby zastąpić kompresję Unix zip nie jest lepszy od tar + gzip na Uniksie, z kilku powodów. (Gdy widzisz .tar.gzpliki, takie są.) Po pierwsze, tar + gzip kompresuje się lepiej niż zip, ponieważ kompresja następnego pliku może wykorzystywać historię z poprzedniego pliku (czasami nazywaną „solidnym” archiwum). zip może kompresować pliki indywidualnie. Po drugie, tar zachowuje wszystkie informacje z katalogu Uniksa, podczas gdy zip nie został do tego zaprojektowany. (Późniejsze rozszerzenia formatu zip z dodatkowymi blokami specyficznymi dla Uniksa próbują rozwiązać ten problem.)
Mark Adler
85
Wygląda na to, że mylisz formaty z implementacją. Implementacja formatu deflate 7-Zip może uzyskać mniej więcej 2–10% lepszą kompresję niż gzip z tym samym formatem deflacji (przy czym zajmuje to znacznie więcej czasu procesora). W 7z LZMA2 formacie ofert na zlecenie 40% lepszą kompresję.
Mark Adler
43

ZIP to format pliku służący do przechowywania dowolnej liczby plików i folderów wraz z bezstratną kompresją. Nie przyjmuje żadnych ścisłych założeń dotyczących zastosowanych metod kompresji, ale najczęściej stosuje się ją z DEFLATE .

Gzip jest zarówno algorytmem kompresji opartym na DEFLATE, ale mniej obciążonym potencjalnymi patentami i innymi, oraz formatem pliku do przechowywania pojedynczego skompresowanego pliku. Obsługuje kompresowanie dowolnej liczby plików i folderów w połączeniu z tar . Plik wynikowy ma rozszerzenie .tgzlub .tar.gzi jest zwykle nazywany plikiem tarball .

zlib to biblioteka funkcji kapsułkujących DEFLATE w najczęstszym wcieleniu LZ77 .

Niels Keurentjes
źródło
28

Najważniejszą różnicą jest to, że gzip jest w stanie skompresować tylko jeden plik, podczas gdy zip kompresuje wiele plików jeden po drugim, a następnie archiwizuje je w jednym pliku. W związku z tym gzip pojawia się w większości przypadków z tar (istnieją jednak inne możliwości). Ma to pewne zalety (nie).

Jeśli masz duże archiwum i potrzebujesz z niego tylko jednego pliku, musisz rozpakować cały plik gzip, aby dostać się do tego pliku. Nie jest to wymagane, jeśli masz plik zip.

Z drugiej strony, jeśli skompresujesz 10 podobnych lub nawet identycznych plików, archiwum zip będzie znacznie większe, ponieważ każdy plik jest kompresowany indywidualnie, podczas gdy w gzip w połączeniu z tar jeden plik jest kompresowany, co jest znacznie bardziej skuteczne, jeśli pliki są podobne (równe).

Tim Zimmermann
źródło
8
Przesadzasz. Gdyby ludzie chcieli skompresowanych archiwów o swobodnym dostępie, mogliby tworzyć pliki „.gz.tar” zamiast plików „.tar.gz”. Nie robią tego, ponieważ większość ludzi nie jest zainteresowana przypadkowym dostępem. Istnieje duża społeczność wokół formatu archiwizacji internetowej .warc.gz i potrzebują one losowego dostępu, więc kompresują każdą stronę osobno. Korzystasz z tego formatu za każdym razem, gdy patrzysz na stronę internetową w Internet Archive Wayback Machine.
Greg Lindahl
2
„.gz.tar” nie zapewnia dostępu losowego, ponieważ format tar nie ma możliwości losowego dostępu do swoich wpisów. Musisz przejrzeć wszystkie wpisy od początku, aby uzyskać jeden konkretny wpis, a co gorsza: musisz przejść przez wszystkie wpisy do końca, ponieważ ten sam plik może być archiwizowany kilka razy (w kilku wersjach) w kilku miejscach w tym samym archiwum - i nie ma sposobu, aby to rozgryźć, oprócz przeczytania całego wpisu archiwum według pozycji.
Min-Soo Pipefeet