忍者ブログ

別館 まじサビ

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

ZIPファイル構造 - 番外編

番外編の前にやること残ってるだろとツッコミはおいといて、今回は不正(正式な方法ではないという意味)な手段に打って出てZIPを展開できるかやってみました。今回の方法はPNG画像に擬態させて画像展開機構に丸投げです(笑)

結論から言えば…大失敗!(笑)、、、当然ですがorz。
そもそもなんでこんな賭けに出たかと言えば、それを推奨するとんでもないサイトがあるからです!えぇもちろんあのサイトです(笑 知らない仲でもないと声を小にしていっておく。
ZIPとPNGでは共通のアルゴリズムを使っている場所があり比較的簡単にできると思ったのに。まず何と言ってもデータ圧縮にDeflateを使うところ、大半のZIPはこれだしPNGでは必須ですから。あとはCRCの算出式→マジックナンバー一緒だったよ!逆に気を付ける点はエンディアンか…めんどいっすね。しかもPNGってブロックごとにCRCもってんのね?幸いCRCの計算は後付(ZIPが圧縮前のデータから算出するのに対してPNGは圧縮後のデータから算出する)みたいだから展開後のデータがわからなくても大丈夫みたい。
で、仕様に沿ってPNGファイルを構築していく。まずヘッダーは横幅を展開後のデータサイズにしてとりあえずパレットモードでインターレスはNGっと。パレットにしたからにはパレットを用意して。データ部分はZIPから切り出した圧縮データをまるっと埋め込んで。最後にふたをする。っよしできた。他にもいろいろ埋め込める情報があるけど…展開後の画像に対しての補正情報なんか埋め込むわけにいかないよね。
早速PNG展開(ビューアのような物に渡す)!…チッ結果は前述のとおり。
原因究明のためにPNGの仕様書を読み進める…どうやらPNGの画素データは単純にパレット番号が並んでいるだけではなかったようだ。各横スキャンラインの先頭(座標で言うとx=-1?)にフィルタの選択番号があるらしい。フィルタ選択を省略する方法は無く0(フィルタの適用計算不要)を指定する必要がありそうだ。
とりあえず1x1のPNGを作ってこの圧縮データを取り出した(パレットモードだった、助かった)。あとはこれをなんとか連結したい。しかし連結するためには一度展開し再圧縮(計算)する必要が、それでは意味がない。っっとPNGのデータブロックは分割できるんだった!という訳でパレットとデータの間に差し込んで実行っ
だめかーーーっ
きっと1x1を展開したところで完結しちゃってるんだなきっと。やはりDeflateのストリーム自体を連結させないとダメってことですね。展開せずに連結する方法は…アレか。Deflateのストリームにもブロックという区分けがあるわけだから2つのブロックをつなぐ(たぶん)1箇所を書き換えてあげればあるいはいけるか?
しかしどこだ?「ここで終わる」を「次のブロックへ続く」に直すのか?それとも「このブロックが最後」を「このブロックは途中」に直すのか?う~ん。Deflateを理解するのはまだまだ当分先になりそうだ…残念orz。←またこんなオチかい

PR

comment

お名前
タイトル
E-MAIL
URL
コメント
パスワード

TemplateDesign by KARMA7

このブログはステキなTemplateを少し改造して利用しています。

忍者ブログ [PR]