Archive for 2009/8/17
以前、ByteArray.uncompress()でいろいろな解凍に失敗するということを書きましたが、
間違っていました。
完全なるzipの構造データの読み間違いでした。
何を間違ったかといえば、zipファイルの構造は
- local file header (ヘッダ部分)
- data ( データ本体)
– ファイル分だけ繰り返し - - central directory
- ファイル分だけ繰り返し - - end of central directory record
のような感じになっています。
ここで、central directoryのデータと、local file headerのデータ構造はほぼ一緒で、また、データもほぼ一緒です。
したがって、私が作ったzipライブラリはこのcentral directory を後ろから探してファイルの情報を見ています。
たまーに拡張部分のデータが異なるのです。
しかし、ほぼ一緒ではなく“完全に同じ”としてしまったために、拡張部分のデータがデータ本体に含まれてしまい、
解凍ができなかったというわけです。
試しに、deflate64(version made by = 2.1) のデータもzip64のデータ(version made by 4.5)もきちんと解凍できました。
多分、解凍に必要なバージョン( version needed to extract ) <= 2.0 なら大丈夫なのかなという感じです。
まあ、この辺もdeflate圧縮 ( LZ77 + Haffman法)をひっくり返して勉強してみて、自分が間違っているのだなーという感触を得たので、
たまにコアな部分の勉強も悪くないものです。
というわけで、AIR版圧縮・解凍アプリ(Anzipper)もバージョン 0.85でこれらのバグが治っています。
ちなみにZIPの構造について勉強させてもらった資料は
- http://www.pkware.com/documents/casestudies/APPNOTE.TXT
- http://www.wankuma.com/seminar/20080823osaka22/Default.aspx
のhttp://www.wankuma.com/seminar/20080823osaka22/4.pdf
を参考にさせていただきました。

