web-dev-qa-db-ja.com

Zlib、gzip、Zipはどのように関連していますか?彼らは何に共通していますか、そしてそれらはどう違うのですか?

zlib で使用されている圧縮アルゴリズムは gzip Zip のそれと基本的に同じです。 gzip および Zip とは何ですか?それらはどう違いますか、そしてそれらはどのように同じですか?

875
Abhishek Jain

短縮形:

.Zipはアーカイブフォーマットです 通常は デフレート圧縮方法を使用します.gz gzipフォーマット は単一ファイル用で、Deflate圧縮方式も使用します。多くの場合、gzipは tarと組み合わせて圧縮アーカイブ形式.tar.gzを作成するために使用されます。 zlibライブラリ は、Zip、gzip、 png (deflateデータに zlibラッパーを使用する )、および他の多くのアプリケーションで使用するためのDeflate圧縮および解凍コードを提供します。

長い形式:

Zipフォーマット はPhil Katzによってオープン仕様のオープンフォーマットとして開発されました。そこでは彼の実装であるPKZIPがシェアウェアでした。ファイルとそのディレクトリ構造を格納するアーカイブ形式で、各ファイルは個別に圧縮されています。ファイルタイプは.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には、データを圧縮せずに比較的少ない拡張で効果的に保存する手段もあります。方法8は可能であるのに対してストリーミング。)

ISO/IEC 21320-1:2015ファイルコンテナ規格 は、Javaアーカイブファイル(.jar)、Office Open XMLファイル(Microsoft Office .docx、.xlsx、.pptxなど)で使用される制限付きZip形式です。 )、Office Document Formatファイル(.odt、.ods、.odp)、およびEPUBファイル(.epub)。この規格では、圧縮方式を0と8に制限しているほか、暗号化や署名がないなどの他の制約もあります。

1990年頃、 Info-Zipグループ は、Zipおよびunzipユーティリティの移植可能で無料のオープンソース実装を作成し、Deflateフォーマットによる圧縮、およびそれ以前のフォーマットの解凍をサポートしました。これは.Zipフォーマットの使用を大いに拡大しました。

90年代初頭、 gzipフォーマット は、Info-ZipユーティリティのDeflateコードから派生した UNIX compressユーティリティ の代わりとして開発されました。 Unixのcompressは、単一のファイルまたはストリームを圧縮し、ファイル名に.Zを付加するように設計されています。 compressLZW圧縮アルゴリズム を使用していましたが、その当時は特許を取得しており、その自由な使用は特許権者によって異議がありました。特定のDeflateの実装はPhil Katzによって特許を取得されていますが、その形式はそうではなかったので、どの特許も侵害しないDeflate実装を書くことは可能でした。その実装は過去20年以上それほど挑戦されていません。 Unixのgzipユーティリティは、compressの代わりになるドロップインとして意図されており、実際にはcompress圧縮データを解凍することができます(その文を解析できたと仮定して)。 gzipは、ファイル名に.gzを追加します。 gzipは、Deflate圧縮データフォーマットを使用します。これは、Unixのcompressよりもかなり圧縮率が高く、非常に高速に解凍され、データの整合性チェックとして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画像フォーマットの自由な使用を問題にし、掲示板やWorld Wide Web(当時は新しいもの)で広く使われていました。そのため、小さなグループが.pngを置き換えるために、ファイルタイプ.gifを持つPNGの可逆圧縮画像フォーマットを作成しました。そのフォーマットは、圧縮のためにDeflateフォーマットも使用します。これは、画像データのフィルタがより多くの冗長性を公開した後に適用されます。 PNGフォーマットの普及を促進するために、2つのフリーコードライブラリが作成されました。 libpngzlib 。 libpngはPNGフォーマットのすべての機能を処理し、zlibはlibpngおよび他のアプリケーションで使用するための圧縮および解凍コードを提供しました。 zlibはgzipコードから改造されました。

上記の特許はすべて期限切れです。

Zlibライブラリは、Deflate圧縮と解凍、およびdeflateストリームを囲む3種類のラップをサポートしています。まったく折り返さない( "raw" deflate)、 zlib折り返し (PNG形式のデータブロックで使用される)、およびgzip折り返し。プログラマにgzipルーチンを提供します。 zlibとgzipのラッピングの主な違いは、zlibのラッピングがよりコンパクトで、gzipの場合は最低18バイトであり、整合性チェックのAdler-32はgzipが使用するCRC-32よりも高速であることです。生のdeflateは.Zipフォーマットを読み書きするプログラムによって使用されます。これはdeflate圧縮データをラップする別のフォーマットです。

zlibは現在、データ転送とストレージに広く使用されています。たとえば、サーバーやブラウザによるほとんどのHTTPトランザクションは、zlibを使用してデータを圧縮および解凍します。

CPU時間の圧縮効率とのトレードオフを可能にする選択可能な圧縮レベルの存在によって証明されるように、deflateの実装が異なると、同じ入力データに対して異なる圧縮出力が発生する可能性があります。 zlibとPKZIPがdeflate圧縮と解凍の唯一の実装ではありません。 7-Zipアーカイブユーティリティ とGoogleの zopfliライブラリ の両方で、deflateフォーマットを使用するときに可能な最後の数ビットを絞り出すためにzlibよりもはるかに多くのCPU時間を使用できます。 zlibの最高の圧縮レベルと比較して数パーセント。 gzipの並列実装である pigzユーティリティ には、zlib(圧縮レベル1〜9)またはzopfli(圧縮レベル11)を使用するオプションが含まれており、zopfliを使用することによる時間的な影響を軽減します。複数のプロセッサとコア上のファイル。

2307
Mark Adler

Zip は、任意の数のファイルとフォルダを可逆圧縮とともに格納するために使用されるファイル形式です。使用されている圧縮方法について厳密な想定はしていませんが、 _ deflate _ で最も頻繁に使用されています。

Gzip はDEFLATEをベースとした圧縮アルゴリズムですが、潜在的な特許などに邪魔されることもなく、単一の圧縮ファイルを格納するためのファイルフォーマットでもあります。 tar と組み合わせると、任意の数のファイルとフォルダを圧縮できます。結果のファイルの拡張子は.tgzまたは.tar.gzであり、一般的に tarball と呼ばれます。

zlib は最も一般的な LZ77 の形式でDEFLATEをカプセル化した関数のライブラリです。

40

最も重要な違いは、Zipは複数のファイルを1つずつ圧縮し、その後それらを1つのファイルにアーカイブするのに対して、gzipは1つのファイルしか圧縮できないことです。したがって、gzipはほとんどの場合、tarと一緒になります(ただし、他の可能性もあります)。これにはいくつかの(不利な)利点があります。

もしあなたが大きなアーカイブを持っていて、その中から一つのファイルしか必要としないのであれば、そのファイルに到達するためにgzipファイル全体を解凍する必要があります。 Zipファイルがある場合、これは必要ありません。

一方、10個の同じファイル、あるいはまったく同じファイルを圧縮すると、Zipアーカイブは各ファイルが個別に圧縮されるため、はるかに大きくなります。一方、gzipでは、tarと組み合わせて単一のファイルが圧縮されます。似ている(等しい)。

25
Tim Zimmermann