| この記事の要点 |
|
概要
ZIP は 1989 年に米 PKWARE 社の Phil Katz が公開した、ファイル名・属性・複数ファイルのまとめ(アーカイブ)と、データの圧縮を 1 つの形式の中で同時に行う ファイルフォーマットです。Unix 系で広く使われる「tar でまとめてから gzip で圧縮する」二段構えとは対照的に、ZIP は各エントリを個別に圧縮してから 1 ファイルに格納するため、特定のファイルだけを取り出す(ランダムアクセス)のが高速という利点があります。
仕様は APPNOTE.TXT として PKWARE が公開しており、互換実装が容易だったことから世界中に普及しました。Windows は XP 以降「圧縮フォルダー」として、macOS は「アーカイブユーティリティ」として OS 標準で読み書きをサポートしており、ユーザーが追加ソフトを入れずに扱える「事実上の世界標準アーカイブ形式」となっています。
Microsoft Office の .docx / .xlsx / .pptx や、Java の .jar、Android の .apk、EPUB 電子書籍など、多くのコンテナ形式が中身は ZIP です。拡張子だけ変えれば unzip で中身を覗けることが多いのは、ZIP がそれだけ広く採用されている証拠です。
内部構造とマジックナンバー
ZIP ファイルは大きく分けて以下の 3 領域から構成されます。
- ローカルファイルヘッダ + データ — 各ファイルごとに繰り返し格納。マジックは
50 4B 03 04(PK\x03\x04) - セントラルディレクトリ — ファイル一覧の索引。末尾近くに置かれる。マジック
50 4B 01 02 - EOCD(End of Central Directory Record) — 末尾の固定位置にある終端マーカー。マジック
50 4B 05 06
展開ツールは「ファイルの末尾を読んで EOCD を見つける → セントラルディレクトリを読む → 各エントリにシークする」という順で動きます。末尾基準で動く ため、ZIP の前にゴミが付いていても、自己解凍 EXE のようにヘッダにバイナリが付いていても動作するのが特徴です(self-extracting archive の仕組みもこれを利用)。
圧縮方式(compression method)は仕様上は複数選べますが、実運用では method=8(Deflate)がほとんどです。ZIP64 拡張では method=12 (BZIP2)、method=14 (LZMA)、method=93 (Zstandard) なども定義されていますが、対応していない解凍ソフトに渡すと開けないため、互換性重視なら Deflate に留めるのが安全です。
主な用途
- メール添付やクラウドストレージ経由でのフォルダ受け渡し(Windows/Mac/Linux のどこでも開ける)
- ソフトウェア配布アーカイブ(バイナリ + 設定 + README をひとまとめに)
- Office Open XML(.docx/.xlsx/.pptx)、Java JAR、Android APK、EPUB のコンテナ
- Web からのダウンロード(複数ファイルを 1 リクエストで取得させたい場面)
- パスワード付き機密データの簡易配布(AES-256 を使うこと、ZipCrypto は避けること)
関連形式との比較
| 形式 | 圧縮率 | 速度 | 暗号化 | OS 互換性 | 備考 |
|---|---|---|---|---|---|
| ZIP (Deflate) | 中 | 速い | AES-256 / ZipCrypto | Windows/macOS 標準 | 事実上の世界標準 |
| 7z | 非常に高い | 遅い | AES-256 | 要 7-Zip | LZMA2 + 固体圧縮 |
| tar.gz | 中 | 速い | なし(GPG 併用) | Unix 標準 | パーミッション保持 |
| RAR | 高い | 中 | AES-256 | 要 WinRAR | 独占仕様 |
| Zstandard | 中〜高 | 非常に速い | なし | 新興 | 解凍が極めて速い |
コマンド・ツール
# フォルダを ZIP に圧縮(Linux/macOS)
zip -r archive.zip mydir/
# ZIP を展開
unzip archive.zip
# 中身一覧(展開せず確認)
unzip -l archive.zip
# パスワード付き ZIP を作成(AES-256)
# ※標準の zip コマンドは ZipCrypto のみ。AES-256 が要るなら 7z を使う
7z a -tzip -p'mypassword' -mem=AES256 secret.zip mydir/
# 文字化け対策で Shift_JIS のファイル名を UTF-8 に変換しつつ展開
unzip -O cp932 archive.zip # Info-ZIP 6.0 以降
# Windows PowerShell 5.1+
Compress-Archive -Path .\mydir\* -DestinationPath archive.zip
Expand-Archive -Path archive.zip -DestinationPath .\out\
注意点・落とし穴
- ZipSlip 脆弱性 — エントリ名に
<../../etc/passwd>のようなパストラバーサルが含まれる ZIP を、検証なしで展開するライブラリは任意のパスへ書き込まれてしまう。展開先のディレクトリ配下に正規化後のパスが収まるかを必ずチェックする。 - ZipCrypto は破られる — 既知平文攻撃で短時間で復号される。パスワード保護を使うなら必ず AES-256 を指定する。
- ファイル名の文字コード — 古い ZIP は Shift_JIS、新しい ZIP は UTF-8(汎用フラグ bit 11 で示す)と混在しがちで、Windows/macOS/Linux 間で文字化けが起きる。
unzip -O cp932や 7-Zip の文字コード指定で対処する。 - 4GB / 65,535 ファイル制限 — 従来仕様の限界。これを超える場合は ZIP64 拡張が必要だが、古い解凍ソフトでは開けない可能性がある。
- Symlink/特殊ファイル — Unix のシンボリックリンクや特殊属性は ZIP では完全には表現できない。これらを保ちたいなら tar を使う。
関連リンク
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Git pushした変更の取消し|revert・履歴変更と保護の注意点 2026-10-15 23:49:01
- Gitでローカルを戻す前に|reset・restoreの違いと退避範囲 2026-10-15 23:49:01
- Git rebaseの使い方|対象範囲・競合解決・pushの判断 2026-10-15 22:50:59
- Git pullの使い方|取込み先・ff-only・競合とstashの注意点 2026-10-15 22:50:59
- Git pushの使い方|送信先・タグ・force-with-leaseの条件 2026-10-15 22:12:47
- Git remoteの設定・確認・削除|SSH URLとfetch/pushの違い 2026-10-15 22:12:47
- Gitリモートリポジトリの作成|初回push・既存履歴・mirrorの注意 2026-10-15 15:48:16
- Gitのuser.name・user.email設定|local/global・確認と過去履歴の注意 2026-10-15 15:30:07
- LinuxにGitをインストール|配布元・初期設定・TLSと認証の確認 2026-10-15 15:30:06
- Git導入と初回push|Linuxサーバー・Windows/macOS・SSH設定 2026-10-15 14:51:54
- Db2のCREATE INDEX|索引定義・INCLUDEと実行計画の確認 2026-10-15 14:10:22
- Db2の自動採番|IDENTITY・ID取得とRESTARTの注意点 2026-10-15 14:10:22
- 【DB2】特定スキーマの全テーブルの全カラム情報を取得する方法 2026-10-15 13:53:15
- Db2のシーケンスとIDENTITYの違い|採番とカタログの確認SQL 2026-10-15 13:53:15
- Db2で複数カラムをUPDATEする方法|SET・WHEREと更新前の値 2026-10-15 13:53:15