Zipファイルを分析しようとしているときに、少し混乱しているセクションの1つはZip64 Extra Information Field
です。特定のフィールドがファイルヘッダー(中央ディレクトリまたはローカル)に収まらない場合に生成されることが予想されるため、ヘッダーに0xffffffffを挿入し、実際の値を追加情報フィールドに配置します。
ドキュメントによると ここ 、これは構造に続く追加フィールドの1つとして見つけることができます:
Value Size Description
----- ---- -----------
(Zip64) 0x0001 2 bytes Tag for this "extra" block type
Size 2 bytes Size of this "extra" block
Original
Size 8 bytes Original uncompressed file size
Compressed
Size 8 bytes Size of compressed data
Relative Header
Offset 8 bytes Offset of local header record
Disk Start
Number 4 bytes Number of the disk on which
this file starts
これは、拡張情報エントリのサイズが常に28バイトであることを期待する必要があることを意味します。
しかし、実際のZip64アーカイブを分析したところ、ファイルオフセットが0xffffffffである中央ディレクトリエントリが1つ見つかりました。次のステップは、Extraデータフィールドで0x0001ヘッダーIDを探すことでした(データサイズは28バイトであると予想されます)。
しかし、代わりに00 01 00 08 00 36 d4 6b ab 02 00 00 00
(0x0001ヘッダーID、8バイトサイズ、値0x02ab6bd436の1フィールドに変換)を見つけました。これは、ローカルファイルヘッダーオフセットを正しく表します。 Zip64 Extra Information Field
のドキュメントに他のフィールドが記載されていないのはなぜですか?
Linuxマシンで利用可能な標準のZip
ユーティリティを使用しています。
あなたはもう答えを必要としないと確信していますが、将来の読者のために。仕様に従って、64個の追加ブロックフィールドは必要な場合にのみ表示されます。
4.5.3 -Zip64 Extended Information Extra Field (0x0001):
The following is the layout of the Zip64 extended
information "extra" block. If one of the size or
offset fields in the Local or Central directory
record is too small to hold the required data,
a Zip64 extended information record is created.
The order of the fields in the Zip64 extended
information record is fixed, but the fields MUST
only appear if the corresponding Local or Central
directory record field is set to 0xFFFF or 0xFFFFFFFF.
Note: all fields stored in Intel low-byte/high-byte order.
Value Size Description
----- ---- -----------
(Zip64) 0x0001 2 bytes Tag for this "extra" block type
Size 2 bytes Size of this "extra" block
Original
Size 8 bytes Original uncompressed file size
Compressed
Size 8 bytes Size of compressed data
Relative Header
Offset 8 bytes Offset of local header record
Disk Start
Number 4 bytes Number of the disk on which
this file starts
したがって、ローカル/中央ディレクトリレコードで0xFFFFまたは0xFFFFFFFFとマークされているものだけが、64の追加ブロックに表示されます。
あなたが言及した場合、残りのフィールド(非圧縮、圧縮、ディスク)は適切に通知され、ローカル/セントラルから読み取られる必要があります。