2016-11-16 36 views
0

私はやや大きなバイナリファイル(717M)を扱っています。このバイナリファイルには、完全なzipファイルの集合(未知数!)が含まれています。大きなバイナリファイルからzipファイルを抽出する

私はそれらのすべてのzipファイルを展開したいと思います(それらを明確に解凍する必要はありません)。私はマジックナンバー( 'PK')のおかげで各チャンクのオフセット(開始点)を見つけることができましたが、各チャンクの長さを計算する方法を見つけることができません(例えば、バイナリーファイル)。

いくつかのドキュメント(http://forensicswiki.org/wiki/ZIP)を読むと、各圧縮ファイルのcompressed sizeが含まれているので、ZIPファイルを解析するのが簡単だという印象を与えてくれます。

私は車輪を再発明せずにCやPythonでそれを行う方法はありますか?

答えて

1

たとえば、zip files in pythonを扱ういくつかの標準的な方法がありますが、私が知っている限り(私は専門家ではありません)、まずは実際のファイルを何らかの形で提供する必要があります。私はzip file format specificationを見ることをお勧めします。

マジックナンバーの相対的な位置に基づいて必要なその他の情報を見つけることができます。私が間違っていないとすれば、CRC-32はマジックナンバーなので、4バイト進むと圧縮されたサイズになり、別の8バイトはファイル名を取得します。

  • ローカルファイルヘッダ署名4バイト(0x04034b50)
  • 2バイト
  • 汎用ビットフラグ2バイト
  • 圧縮方法2バイト
  • 最後MODファイル時刻2バイト
  • を抽出するために必要なバージョン
  • 最新のMODファイルの日付2バイト
  • crc-32 4バイト
  • 圧縮サイズ4バイト
  • 非圧縮サイズ4バイト
  • ファイル名の長さ2バイト
  • 余分なフィールドの長さ2バイト

  • ファイル名(可変サイズ)

  • 余分なフィールド(可変サイズ)

少しでも助けてくれる希望:

2

Zipエントリは、ローカルヘッダーの圧縮サイズを含まないことが許可されています。圧縮されたサイズ、圧縮されていないサイズ、およびCRCが圧縮されたデータに続くディスクリプタを持つフラグビットがあります。

セントラルディレクトリの末尾のヘッダーを検索し、それを使用して中央ディレクトリを検索し、それを使用してローカルのヘッダーとエントリを見つける方が信頼性が高くなります。これには細心の注意が必要です。ジップフォーマットについて記述しているPKWare appnoteをよく読んでください。追加のヘッダーとフィールドを持つZip64形式も処理する必要があります。

ジップエントリをzipファイルのその場所に格納することが可能であり、そのエントリ自体がzipファイルである可能性があります。だから、一番外側のzipファイルだけを抽出して、埋め込みzipファイルの大文字小文字を処理するようにしてください。

関連する問題