zip規格日本語訳(1)

 サイズの大きい.ZIPファイルは複数ボリュームに及ぶか、あるいはユーザ定義のサイズに分離できる。別途指定されない限り、すべてのデータはリトルエンディアンバイトオーダーとして記録される。

.ZIPファイル形式全体概要:
	[ローカルファイルヘッダ1]
	[ファイルデータ1]
	[データ定義1]
	.
	.
	.
	[ローカルファイルヘッダn]
	[ファイルデータn]
	[データ定義n]
	[アーカイブ復号ヘッダ]
	[アーカイブ拡張データ]
	[中央ディレクトリ]
	[中央ディレクトリのzip64終端]
	[中央ディレクトリ場所のzip64終端]
	[中央ディレクトリの終端]

A.ローカルファイルヘッダ

ローカルファイルヘッダ署名値[local file header signature]4 bytes(0x04034b50:PK0304)
展開に必要なバージョン[version needed to extract]2 bytes
オプションのビットフラッグ[general purpose bit flag]2 bytes
圧縮方法[compression method]2 bytes
最終更新時刻[last mod file time]2 bytes
最終更新日[last mod file date]2 bytes
CRC32値[crc-32]4 bytes
圧縮後のサイズ[compressed size]4 bytes
圧縮前のサイズ[uncompressed size]4 bytes
ファイル名の長さ[file name length]2 bytes
拡張データのサイズ[extra field length]2 bytes
ファイル名[file name]可変長(variable size)
拡張データ[extra field]可変長(variable size)


B.ファイルデータ

 ローカルヘッダの直後には圧縮保存されたデータが格納されている。ZIPアーカイブは[ローカルファイルヘッダ][ファイルデータ][データ定義]の繰り返しで構成される。


C.データ定義

CRC32値[crc-32]4 bytes
圧縮後のサイズ[compressed size]4 bytes
圧縮前のサイズ[uncompressed size]4 bytes

 これはオプションの3ビット目が有効であるときだけに記述され、圧縮データの直後に記録される。このデータはシークが使えない、あるいはできないときに用いられるためのものである。

 Zip64形式の場合は、圧縮後のサイズ・圧縮前のサイズはそれぞれ8バイト必要になる。これはファイルサイズが32bit値の最大値を超える場合に利用する(Zip64形式はファイルサイズの条件を満たしていなくても利用される場合がある)。

 本来は用いられないが、0x08074b50(PK0708)の宣言がデータに対する署名値として採用されている。この署名値を使おうが使うまいが、ZIPファイル間での互換性を確立する意味において、手段として理解しておくべきである。Zipファイルを出力するときは、データ定義内に署名値を含めることが推奨されている。署名値が見つかればその直後にはデータ定義に関する情報が続くことになる。

 データ定義に拡張があれば、将来的に仕様として公開されるだろう。この新しい記録方法は、順方向データの競合を解決し、順次読み込みにとってのサポートを意味する。

 中央ディレクトリ(Central Directory)を暗号化するときは、データ定義領域は使われることもあるが、必須ではない。現時点ではオプションのビットフラッグの3ビット目がデータ定義を指し示すのであれば、データ定義部分はすべて0にしておくべきである。


D.アーカイブ復号ヘッダ

 アーカイブ復号ヘッダはZIPフォーマット仕様のVer 6.2で導入された。このデータは、より強力な暗号化方法がサポートできるようにするためのものである。中央ディレクトリ構造体が暗号化されるとき、この復号ヘッダは暗号化されたデータよりも前に来るだろう。暗号化されたデータは拡張データ(もしあれば)と、暗号化された中央ディレクトリ構造体から成り立っている。

 データ構造は圧縮データの前に来る、解凍ヘッダと同一である。中央ディレクトリ構造体が暗号化されていれば、データの開始位置は、中央ディレクトリZip64形式終端の中央ディレクトリ開始位置固定である。

 このヘッダに関しては後述の解説を参照すること。


E.拡張データ

拡張データ署名値[archive extra data signature]4 bytes(0x08064b50:PK0608)
拡張データサイズ[extra field length]4 bytes
拡張データ[extra field data]可変長(variable size)

 拡張データはZIPフォーマット仕様のVer 6.2で導入された。これはより強い暗号のために用意された中央ディレクトリをサポートするためのものである。現時点では中央ディレクトリ構造の直前に記載され、このデータサイズは中央ディレクトリデータのサイズに含まれる。

 中央ディレクトリ構造体が圧縮され、かつ暗号化されていないのであれば、データの開始位置は中央ディレクトリZip64形式終端の中央ディレクトリ開始位置固定である。


F.中央ディレクトリ構造
	[ファイルヘッダ1]
	.
	.
	.
	[ファイルヘッダ2]
	[デジタル署名]
	(※訳者注:つまり、PK0304の繰り返しの後にPK0102が繰り返し記録される)

ファイルヘッダ:

中央ディレクトリ署名値[central file header signature]4 bytes (0x02014b50:PK0102)
作成されたバージョン[version made by]2 bytes
展開に必要なバージョン[version needed to extract]2 bytes
オプションのビットフラッグ[general purpose bit flag]2 bytes
圧縮方法[compression method]2 bytes
最終更新時刻[last mod file time]2 bytes
最終更新日[last mod file date]2 bytes
CRC32値[crc-32]4 bytes
圧縮後のサイズ[compressed size]4 bytes
圧縮前のサイズ[uncompressed size]4 bytes
ファイル名の長さ[file name length]2 bytes
拡張データのサイズ[extra field length]2 bytes
コメントのサイズ[file comment length]2 bytes
ディスク番号[disk number start]2 bytes
内部ファイル属性[internal file attributes]2 bytes
外部ファイル属性[external file attributes]4 bytes
ローカルヘッダへの相対位置[relative offset of local header]4 bytes
ファイル名[file name]可変長(variable size)
拡張データ[extra field]可変長(variable size)
コメント[file comment]可変長(variable size)

デジタル署名(Digital signature):
ヘッダ署名値[header signature]4 bytes (0x05054b50:PK0505)
データのサイズ[size of data]2
署名データ[psignature data]可変長(variable size)

 仕様のVer 6.2では、中央ディレクトリに圧縮と暗号化の両方が適用された状態で保存される場合がある。必要ではないが、ストレージに対する配慮から、暗号化された中央ディレクトリ構造を圧縮するケースも考えられる。中央ディレクトリ暗号化における情報は「強力な暗号化」の項目に記載してある。

 デジタル署名に関しては圧縮も暗号化もされることはない。


G.中央ディレクトリのzip64終端(Zip64 end of central directory record)
署名値[zip64 end of central dir signature]4 bytes (0x06064b50:PK0606)
データのサイズ[size of zip64 end of central directory record]8 bytes
作成されたバージョン[version made by]2 bytes
展開に必要なバージョン[version needed to extract]2 bytes
ディスク番号[number of this disk]4 bytes
中央ディレクトリの開始におけるディスクの数[number of the disk with the start of the central directory]4 bytes
ディスク上の中央ディレクトリ内のエントリー数[total number of entries in the central directory on this disk]8 bytes
中央ディレクトリ内のエントリー数[total number of entries in the central directory]8 bytes
中央ディレクトリのサイズ[size of the central directory]8 bytes
ディスク番号の開始に関する中央ディレクトリ開始の位置[offset of start of central directory with respect to the starting disk number]8 bytes
zip64拡張データ領域[zip64 extensible data sector]可変長(variable size)

 データのサイズ(size of zip64 end of central directory)の値は残りのデータサイズを格納するため、前の12バイト分は計算から除外すること。

(Size = SizeOfFixedFields + SizeOfVariableData - 12)

 上のデータ構造は、中央ディレクトリのzip64終端のVer 1.0を意味している。Ver 1.0は64bitサイズファイルをサポートするVer 6.2以前の仕様で採用されている。Ver 6.2の仕様では、強力な暗号化に対応するため、Ver 2.0のデータ構造が定義されている。詳細は「強力な暗号定義」の項目を参照すること。

 Ver 1.0と2.0を識別するため、以下のようなヘッダを含めなくてはいけない。

ヘッダID[Header ID]2 bytes
データサイズ[Data Size]4 bytes

 ヘッダIDは以下に続くデータのタイプを表し、データサイズは以下に続くデータのサイズを示す。複数の特別なデータがあるにしても、ヘッダIDとそのサイズが前もって用意されているはずである。ヘッダIDの持つ意味は付録Cに記載している。


H.中央ディレクトリ場所のzip64終端

署名値[zip64 end of central dir locator signature]4 bytes (0x07064b50:PK0607)
中央ディレクトリのzip64終端におけるディスク数[number of the disk with the start of the zip64 end of central directory]4 bytes
中央ディレクトリのzip64終端の相対位置[relative offset of the zip64 end of central directory record]8 bytes
ディスクの総数[total number of disks]4 bytes


I.中央ディレクトリの終端

署名値[end of central dir signature]4 bytes (0x06054b50:PK0506)
ディスク番号[number of this disk]2 bytes
中央ディレクトリ開始におけるディスク番号 [number of the disk with the start of the central directory]2 bytes
ディスク上の中央ディレクトリ内エントリー数 [total number of entries in the central directory on this disk]2 bytes
中央ディレクトリ内のエントリー数 [total number of entries in the central directory]2 bytes
中央ディレクトリのサイズ[size of the central directory]4 bytes
開始ディスク番号に対する中央ディレクトリの開始位置 [offset of start of central directory with respect to the starting disk number]4 bytes
ファイルコメントのサイズ[.ZIP file comment length]2 bytes
ファイルコメント[.ZIP file comment]可変長(variable size)


K.ZIPファイルの分割とスパニング

 スパニングとは複数の記録メディアにわたってZIPファイルを分ける過程のことを指す。これは単にDOSフォーマットのフロッピーディスクのために用意されたものである。

 ファイル分割はスパニングの派生である。スパニングと同じ過程を経るが、個別のメディアに保存せずとも、同一のメディアにすべての分割ファイルを記録することができる。スパニングとの違いは、スパニングは分割されたファイルがすべて同じファイル名と言うことである。

 ここのセグメントに適用される書式は「PKBACK#xxx(xxxは001から始まる10進数)」である。

名前の衝突を避けるため、以下のように名付けられる。
セグメントその1:filename.z01
セグメントそのn-1:filename.z(n-1)
セグメントそのn:filename.zip

 番号は10進数。セグメントの最大値は4,294,967,295 - 1、分割後の個々のファイルの最大サイズは4,294,967,295バイト。ここのサイズは異なっても構わないが、中央ディレクトリヘッダを分割してはいけない。ヘッダを書き込む余地がないのであれば、次のセグメントでヘッダの記述を始めること。


L.共通事項

1)特記がない限り、変数はunsignedで、インテルlow-byte:high-byte, low-word:high-wordの順番で記録する。
2)サイズは明記されるため、文字列はNULLでは終わらない。
3)中央ディレクトリーのエントリーとZIPファイルで探索される順番とは一致させる必要はない。
4)容量が大きすぎるのであれば、その値は0xFFFFもしくは0xFFFFFFFFにし、Zip64レコードとして作成する。
5)分割ファイルについては、32bitデータおよび64bitデータの中央ディレクトリーは同じディスクに置くこと。