zip_file_source実装開始
今日はZIPフォーマットの資料を集めて、無圧縮zipの読み込みまで実装しました。
<hamigaki/iostreams/device/zip_file.hpp>
ヘッダ構造体はまだ適当です。
LZHともtarとも違う形式ですが、それらを統一するか、なんらかの抽象化を行うかは未定です。
3つのフォーマットを実装してみれば、方向性も決まってくるのではないかと思います。
ZIPファイルのおおよその構造はこうなっています。
+-----------------------+ |ローカルファイルヘッダ0| +-----------------------+ | ファイルデータ0 | +-----------------------+ | ・・・ | +-----------------------+ |ローカルファイルヘッダn| +-----------------------+ | ファイルデータn | +=======================+ | ファイルヘッダ0 | +-----------------------+ | ・・・ | +-----------------------+ | ファイルヘッダn | +=======================+ | フッタ | +-----------------------+
ファイルデータ(圧縮イメージ)の前にローカルファイルヘッダと呼ばれるファイル情報があって、それとほぼ同じものがファイルの末尾にまとめて記録されます。(セントラルディレクトリ)
このデータの二重持ち構造のせいもあってか、フォーマットにはアーカイバ毎に微妙な違いがあるようです。
例えば、ZIP32J.DLLで圧縮した書庫をCygwinのzip(Info-ZIP)で検証すると、
$ zip -T -v abc.zip zip info: local extra (116 bytes) != central extra (17 bytes): zip/ zip info: local extra (101 bytes) != central extra (17 bytes): zip/abc.txt Archive: abc.zip testing: zip/ OK testing: zip/abc.txt OK No errors detected in compressed data of abc.zip. test of abc.zip OK
と、ローカルファイルヘッダとセントラルディレクトリの不一致が報告されました。
Lhaplusで作った書庫だと、
$ zip -T -v zip.zip zip error: Nothing to do! (zip.zip)
よく分からないエラーになりました。
実用的な実装に仕上げるにはなかなか骨が折れそうです。