PK0708ヘッダ
 前回の圧縮zip作成プログラムでは、圧縮後のサイズの記録をseekによってファイルポインタをいったん戻すことで書き換えていましたが、zip形式ではそのようなseekによる移動ができない環境のための方法が用意されています。

 まずはZipHeader.optionの3ビット目をオンにすることで、「PK0304ヘッダにはCRC32値やファイルサイズは置いていない」ことを宣言します。なお、この宣言が行われると、PK0304ヘッダ内にある「crc32」「compsize」「uncompsize」は無視されるようになるため、それぞれの値は0のままにしておきます。

 これら3つの値は、CRC32や圧縮後のサイズが算出済みとなる圧縮データの直後でのPK0708ヘッダに書き込みます。


struct ArchiveDataHeader1
{
	unsigned int signature;	// 0x08074B50を代入
	unsigned int crc32;
	unsigned int compsize;
	unsigned int uncompsize;
};

struct ArchiveDataHeader2
{
	unsigned int crc32;
	unsigned int compsize;
	unsigned int uncompsize;
};

 ヘッダにはsignatureの有るバージョンと無いバージョンがありますが、本来の仕様としては署名(PK0708)なしを用います。一方で、zipファイルヘッダの互換性を維持するため、PK0708をヘッダの最初に付け加えたものを出力するアーカイバも存在します。

 この「アーカイブデータ後出し宣言」方法は、シーケンシャルアクセスで書き込みたいときはもちろん、seekによる移動量の計算が面倒くさいときに使うのもよいでしょう。