ZIP ファイルとは何ですか?
.zip 拡張子を持つファイルは、1 つ以上のファイルまたはディレクトリを保持できるアーカイブです。 ZIP ファイルのサイズを小さくするために、アーカイブに含まれるファイルに圧縮を適用できます。 ZIP ファイル形式は、1989 年 2 月に Phil Katz によってファイルとフォルダーのアーカイブを実現するために公開されました。この形式は、利用可能な仕様、Microsoft (Windows 7 以降)、Apple (Mac OS X) など、多くの企業がソフトウェア ユーティリティの一部として ZIP ファイル形式を採用しています。
ZIP ファイル形式の歴史
ZIP ファイル形式の歴史は、システム エンハンスメント アソシエイツ (SEA) が PKWARE に対し、その商標および製品の外観とユーザー インターフェイスの著作権に対する許可なしに ARC ユーティリティを使用したとして提訴した事件にまでさかのぼります。これに先立ち、Phil Katz は SEA のソース コードを書き直し、ARC 抽出プログラムである PKXARC とファイル圧縮プログラムである PKARC を MS-DOS ベースのシステム用のフリーウェアとしてリリースしました。訴訟に敗れ、PKWARE は ARC に関連するものを使用できなくなりました。ここで、PKWARE, Inc. の PKZIP ユーティリティの一部となった ZIP という名前の新しいファイル圧縮が作成されました。
Katz は、ZIP ファイル形式の仕様をパブリック ドメインにリリースしましたが、圧縮および抽出ユーティリティ、つまり PKZIP に対する所有権は保持しています。 ZIP 圧縮システムは、ファイルを圧縮するための 32 ビット巡回冗長検査 (CRC) アルゴリズムを使用して、フォルダー内のファイルをアーカイブすることができました (そして現在も可能です)。サイズ。 ARC とは異なり、.ZIP フォルダーには、圧縮ファイルのレンダリングに必要な情報を保持する、暗号学者のコード ブックの役割を果たすディレクトリ ファイルが含まれていました。
ZIP でサポートされている圧縮方法
.ZIP ファイル形式の仕様に従って、次の圧縮方法がサポートされています。
- ストア - 圧縮なしを意味します
- 縮む
- リダクション (これは、レベル 1 からレベル 4 までの範囲の圧縮係数を意味します) *内破 *空気を抜く *デフラット64
- BZIP2
- LZMA (EFS)
- ウェーブパック
- PPMd バージョン I、Rev 1
DEFLATE は一般的に使用される圧縮方法で、LZ77 とハフマン コーディングの組み合わせを使用する可逆日付圧縮アルゴリズムであり、RFC 1951 で詳しく説明されています。
ZIP ファイル形式の仕様
ZIP ファイルには、さまざまな圧縮技術を使用して複数のファイルを保存する機能があり、同時に、圧縮なしでファイルを保存することもサポートしています。各ファイルは個別に保存/圧縮されるため、アーカイブ全体に圧縮または解凍を適用することなく、ファイルを抽出したり、新しいファイルを追加したりできます。
全体的な ZIP ファイル形式
各 Zip ファイルは、次のように構成されています。
ZIP ファイル形式 |
---|
ローカル ファイル ヘッダー 1 |
ファイル データ 1 |
データ記述子 1 |
ローカル ファイル ヘッダー 2 |
ファイルデータ 2 |
データ記述子 2 |
ローカル ファイル ヘッダー N |
ファイルデータN |
データ記述子 N |
アーカイブ復号化ヘッダー |
追加データ レコードのアーカイブ |
中央ディレクトリ |
ZIP ファイル形式は、アーカイブ目的で 32 ビット CRC アルゴリズムを使用します。圧縮されたファイルをレンダリングするために、ZIP アーカイブは、含まれるファイルのエントリとアーカイブ ファイル内の場所を保持するディレクトリを最後に保持します。したがって、圧縮ファイルをレンダリングするために必要な情報をカプセル化するためのエンコードの役割を果たします。 ZIP リーダーは、ディレクトリを使用して、ZIP アーカイブ全体を読み取ることなく、ファイルのリストをロードします。この形式は、ディレクトリ構造の二重コピーを保持して、データの損失に対する保護を強化します。
ZIP アーカイブ内の各ファイルは、ローカル ファイル ヘッダーとそれに続く圧縮ファイル データで構成される個別のエントリとして表されます。アーカイブの最後のディレクトリには、これらすべてのファイル エントリへの参照が保持されます。 ZIP ファイル リーダーは、ローカル ファイル ヘッダーを読み取らないようにし、あらゆる種類のファイル リストをディレクトリから読み取る必要があります。このディレクトリは、アーカイブの末尾にファイルを追加することもできるため、アーカイブ内の有効なファイル エントリの唯一のソースです。そのため、リーダーが ZIP アーカイブのローカル ヘッダーを最初から読み取ると、アーカイブから削除されるディレクトリの一部ではない無効な (削除された) エントリを読み取る可能性があります。
中央ディレクトリ内のファイル エントリの順序は、アーカイブ内のファイル エントリの順序と一致する必要はありません。
ZIP ファイルのエントリ
ZIP ファイル内のエントリは、各エントリが次の要素で構成されている場合に、次々に配置されます。
- ローカル ファイル ヘッダー
- オプションの追加データ フィールド
- ユーザーデータ (オプションで圧縮/オプションで暗号化)
各エントリのローカル ファイル ヘッダーは、コメント、ファイル サイズ、ファイル名などのファイルに関する情報を表します。追加のデータ フィールド (オプション) には、ZIP 形式の拡張オプションに関する情報を格納できます。
ローカル ファイル ヘッダー
ローカル ファイル ヘッダーには、マルチバイト値で構成される特定のフィールド構造があります。すべての値はリトルエンディアンのバイト順で格納され、フィールドの長さはバイト単位でカウントされます。 ZIP ファイル内のすべての構造は、各ファイル エントリに対して 4 バイトの署名を使用します。中央ディレクトリ署名の末尾は 0x06054b50 であり、独自の一意の署名を使用して区別できます。以下は、ローカル ファイル ヘッダーに格納される情報の順序です。
オフセット | バイト | 説明 |
---|---|---|
0 | 4 | ローカル ファイル ヘッダー署名 # 0x04034b50 (リトル エンディアン番号として読み取る) |
4 | 2 | 抽出に必要なバージョン (最小) |
6 | 2 | 汎用ビットフラグ |
8 | 2 | 圧縮方法 |
10 | 2 | ファイルの最終変更時刻 |
12 | 2 | ファイルの最終更新日 |
14 | 4 | CRC-32 |
18 | 4 | 圧縮サイズ |
22 | 4 | 非圧縮サイズ |
26 | 2 | ファイル名の長さ (n) |
28 | 2 | 余分なフィールド長 (m) |
30 | n | ファイル名 |
30+n | m | エクストラフィールド |
中央ディレクトリ ファイル ヘッダー
オフセット | バイト | 説明 |
---|---|---|
0 | 4 | 中央ディレクトリ ファイル ヘッダー署名 # 0x02014b50 |
4 | 2 | によって作成されたバージョン |
6 | 2 | 抽出に必要なバージョン (最小) |
8 | 2 | 汎用ビットフラグ |
10 | 2 | 圧縮方法 |
12 | 2 | ファイルの最終変更時刻 |
14 | 2 | ファイルの最終更新日 |
16 | 4 | CRC-32 |
20 | 4 | 圧縮サイズ |
24 | 4 | 非圧縮サイズ |
28 | 2 | ファイル名の長さ (n) |
30 | 2 | 追加フィールド長 (m) |
32 | 2 | ファイル コメントの長さ (k) |
34 | 2 | ファイルが始まるディスク番号 |
36 | 2 | 内部ファイル属性 |
38 | 4 | 外部ファイル属性 |
42 | 4 | ローカル ファイル ヘッダーの相対オフセット。これは、ファイルが存在する最初のディスクの先頭からローカル ファイル ヘッダーの先頭までのバイト数です。これにより、中央ディレクトリを読み取るソフトウェアは、ZIP ファイル内のファイルの位置を特定できます。 |
46 | n | ファイル名 |
46+n | m | 追加フィールド |
46+n+m | k | ファイルコメント |
セントラル ディレクトリ レコードの終わり
オフセット | バイト | 説明 |
---|---|---|
0 | 4 | 中央ディレクトリ署名の終わり # 0x06054b50 |
4 | 2 | このディスクの番号 |
6 | 2 | 中央ディレクトリが開始するディスク |
8 | 2 | このディスク上の中央ディレクトリ レコードの数 |
10 | 2 | 中央ディレクトリ レコードの総数 |
12 | 4 | 中央ディレクトリのサイズ (バイト) |
16 | 4 | アーカイブの開始に対する中央ディレクトリの開始のオフセット |
20 | 2 | コメントの長さ (n) |
22 | n | コメント |