虎塚スマートフォン用の表示で見る虎塚この広告は、90日以上更新していないブログに表示しています。第2日目」に参加してきました。http://d.hatena.ne.jp/torazuka/20120820/cafebabeやったこと学んだことをメモします。2つのJavaファイルFoo.javaとBar.javaを作るFooはBarに依存するように作るFoo.javaとBar.javaを1つのjarにするバイナリエディタで見るアスキーダンプを眺めても、圧縮されているせいで、何が何やらほとんど分からないFoo.javaとBar.javaを無圧縮でjarにするjarコマンドを実行する時、オプションに0(ゼロ)をつけると、無圧縮にできるバイナリエディタで見る読める、読めるぞ!というわけで、圧縮版と無圧縮版のjarのバイナリを読みました(両者を比較するところまでは、自分は時間切れでできませんでした)。その後、ハフマン符号化について七誌さんの発表を聴き、LZ77、LZSS、固定ハフマン符号について学びました。用意していただいた問題を解きました。http://www.slideshare.net/7shi/deflate以下では、jar(zip)ファイルの読み方についてまとめます。本文で引用した構造体は、七誌さんが作成された資料からの引用です。jarファイルの読み方jarを読むには、zipの仕様を使います。今回は、主催の七誌さんが事前にZIPの仕様を読み解いて、Cの構造体風に整理してくださっていました。その神プリントを参照しながら、参加者はバイナリを読みました。zipコンテナの中身は、大きく3つに分かれています。ZIP_HEADERZIP_CENTRAL_HEADERZIP_END_HEADERまず、一番下のZIP_END_HEADERから読み始めます。それよりも上の構造の開始位置やサイズが、ZIP_END_HEADERの中に書いてあるからです。ZIP_END_HEADERの開始位置を特定するには、ZIP_END_HEADERのシグネチャを探します。06」というバイト列です。次に、ZIP_END_HEADERの開始位置を見つけたら、その仕様にしたがって、バイナリを読んでいきます。ZIP_END_HEADER:特に大事な要素は、次の3つです。number_of_entriesそのzipに入っているファイルの個数central_dir_sizeZIP_CENTRAL_HEADERのサイズcentral_dir_offsetZIP_CENTRAL_HEADERの開始アドレスPK34、PK12、PK56というのは、それぞれ、ZIP_HEADER、ZIP_CENTRAL_HEADER、ZIP_END_HEADERの先頭にあるシグネチャです。PK34とPK12で始まるブロックは、zipに入っているファイル(とディレクトリ)の個数分だけ、それぞれのHEADERの中に存在します。PK56で始まるブロックは、1つだけです。9B」から始まっていることになります。ここでは、リトルエンディアンなので、値をバイト単位で逆から読みます。central_dir_offsetの値でZIP_CENTRAL_HEADERの開始位置を特定したら、今度はその仕様にしたがって、バイナリを読んでいきます。ZIP_CENTRAL_HEADER:ここでも、大事な要素は3つです。2B」から始まっていることになります。positionの値でZIP_HEADERの開始位置を特定したら、今度はその仕様にしたがって、バイナリを読んでいきます。ZIP_HEADER:以下は、読んでいる最中に教えてもらったコツやポイントです。読み始めのコツzipに入れる前のclassファイル(Foo.class、Bar.class)を、それぞれバイナリエディタで開き、眺めます。各classファイルを示す特徴的なバイト列を、jarファイルの中に確認することで、2つのclassファイルがたしかにjarに含まれているのを見ることができます。jarで圧縮されたサイズの確認ZIP_CENTRAL_HEADERの中に、compressed_sizeとuncompressed_sizeという要素があります。無圧縮のjarでは、この2つの値が同一ですが、圧縮されたjarでは、compressed_sizeの方が小さくなっています。ZIP_CENTRAL_HEADERの意義zipに詰め込まれたファイル(つまり、jarに詰め込まれた2つのclassファイル)のデータが入っているのは、コンテナの一番上にあるZIP_HEADERです。ここに、例のCAFEBABEから始まるバイト列が、そのまま入っています。ZIP_CENTRAL_HEADERは何のためにあるのかというと、ZIP_HEADERのインデックスの役割を持っているのだそうです。ファイルの圧縮/解凍ツールによっては、解凍前に圧縮ファイルの中身を一覧する機能を持っています。そのような機能は、このインデックスを活用するそうです。終了後、気になったのは、このあたりです。jarとzipのバイナリの違い圧縮無しでzipにしたものと、jarのバイナリを比べる。MANIFESTファイルがないことくらいしか、まだ確認していない。jarの圧縮でDeflateが使われている様子まだバイナリで確認していない。見て分かるのかしらん。......宿題ということで。今回の勉強会では本当に色々と教えていただき、Takeばかりで申し訳ないので、今後学んだことを使って何かやったら、日記にメモしていきたいと思います(せめて)。スタッフの皆さん、ありがとうございました。インストールする手順」をなぞったメモRubyとRailsを初めてインストールしたのでメモ。次の記事を興味深く読みました。東京勉強会」へ行ってきましたjaws-ug東京の第8回勉強会へ行ってきました。アーカイブはてなブログをはじめよう!torazukaさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。