そろそろ、Applet上で動作するデモができそうです。 試してみて解ったことが結構ありました。
そこで、学習したしことを、epub形式でまとめています。http://p.booklog.jp/users/kyorohiro
やる気スイッチが入らないので、書きかけの物をさらします。
-------------------------------------------------------------------
ダウンロードの始まり
データをダウンロードは、「へちまたん.torrent」といった、torrentを拡張子に持つファイルを取得することから始まります。
通常、インターネットを通じてWWWから取得することになると思います。
OSのイメージであれば配布しているサイトで手に入るかもしれません。 オープンソースアニメや著作権きれのデータなど、それ専用のデータを野止めているサイトを探すと良いでしょう。「オープンソース アニメ Torrent」、「著作権切れ Torrent」といったキーワードで検索してみてください。Googleで検索すれば簡単に見つかると思います。
このページでは、実際にTorrentファイルを読み込み。どのような情報が記載されているか調べてみましょう。
Bencode/Bencoding で書かれている
Torrentファイルはbencoding という形式で書かれています。 Torrentファイルを読み込むためには、bencodingを解釈できるようにならなくてなりません。 まずは、Bencodingを読み込んでみましょう。
String/Integer/List/Dictionaryを扱える
bencodingは、 String/辞書/リスト の4つのデータ型を扱うことができます。
そして、以下のようなフォーマットで書かれています。
beninteger : "i" [0-9]* "e"
benstring : [0-9]* ":" <bytes array/string>
# bytes array/string length is prev [0-9]*.
bendiction : "d" dictelements "e"
benlist : "l" listelements "e"
benobject : beninteger | benstring | beniction | benlist
listelements : benobject (benobject)*
dictelements : benstring benobject (benstring benobject)*
ひとつひとつ見ていきましょう。
文字列
まずは文字列です。 この本ではbencodingでの文字列をbenstiringと呼ぶことにはます。 例えば、「torrent」という文字列は、こbenstringでは、「7:torrent」と書きます。
また、benstringは 文字列だけでなく、バイト配列としても使われます。<20バイトの配列> は、「20:<20バイトの配列>」とあらわす事ができるのです。
整数
実数です。この本ではbencodingでの整数はbenintegerと呼ぶことにはます。例えば、「1024}という数字は、benintegerでは、[i1024e」と書くことができます。
リスト
リストとは、bencodingで扱えるデータ構造のひとつです。 0個以上のデータを順序ありでデータを保持できます。つまり、 文字、整数、リスト、辞書、を保持することができます。
この本ではbencodingでのリストはbenlistと呼ぶことにはます。
例えば、「512という数字と、"test"という文字列」は、benlistでは、[li512e4:teste」と書くことができます。
辞書
辞書とはbencodingで扱えるデータ構造のひとつです。辞書データは文字列とデータを紐付けで管理することができます。
例えば RPGゲームで主人公のパラメータとして、名前、性別、レベル、得意な魔法、とか設定されているとします。辞書型は、主人公辞書は、"レベル"とキーを渡せば、主人公のレベルが返ります。 女の主人公ならば、"性別"とキーを渡せば、女性と返ります。
辞書です。この本ではbencodingでのリストはbendictと呼ぶことにはます。
例えば、bencodingで 「"レベル" 13」 「"magic" "halito"」 を持つ辞書は、bendictでは、[d5:levelei13e5:magic6:halitoe」と書くことができます。
パースしやすい構造になっている
bencodingはパースし易いつくりになっています。
先頭1文字で、どのデータ構造でできているかが判断できるようになっているからです。
例えば、 integerならば'i'、 stringならば's'、リストならば'l'、辞書ならば、'd' といった感じです。
なので、bencodingのdecoderは、以下のようなシナリオで実現できます。
1. 一文字読み込む。
2. どのデータか判別する。
3. データ形式に応じて読み込む。
4. 1に戻る。
今後の表記について
今後 bencodingでデーター構造を表はする場合は、以下の表記をしようします。
リスト
「li512e4:teste」は、 「[ 512, test] 」と表記します。
辞書
「d5:levelei13e5:magic6:halitoe」は「{level:13, magic:halito}」と表記します。
0 件のコメント:
コメントを投稿