Bencode
    Torrentファイルはbencodeで書かれている。
    Bencodeは、Integer、String、List、Dictionaryを扱える。

Torrentファイルは Bencoding

Torrentファイルは、bencode という形式で書かれています。 Torrentファイルに記載されている事を読み解くためには、 bencode を解釈できるようにならなくてはなりません。まずは、Bencode のパーサーを書いていきましょう。
Bencodingは、文字列、整数、辞書、リストの4つのデータを 扱うことができます。
1
beninteger : “i” [0-9]* “e”
2
benstring : <string length> “:” <bytes array string>
3
string length : [0-9]*
4
bendiction : “d” <dictelements> “e”
5
benlist : “l” <listelements> “e”
6
benobject : beninteger | benstring | bendiction | benlist
7
listelements : benobject ( benobject)*
8
dictelements : benstring benobject (benstring benobject)*
Copied!
そして、上記のようなフォーマットで書かれています。

文字列(String)を扱える

Bencode で文字列は、「<文字の長さ> “:” <文字>」という形式 で書かれています。例えば、「torrentという文字列は、 bencodeでは、「7:torrent」と書く事ができます。
もうひとつ、bencode の文字列は、バイトデータとして扱われ る事もあります。IPアドレスのバイト表示や、Hash値などの非 アスキーな範囲のデータなども、本形式で扱うことができます。
例えば、日本語で「アイ」はSJISで表現すると「0x83, 0x41, 0x83, 0x43」の4バイトで表現できます。この場合、Bencode では、「4:アイ」と表記できます。
oden を、Bencodeで表現する
1
4:oden
Copied!
おでん(SJIS)を、Bencodeで表現する
1
6:オデン
Copied!
SHA1Hashデータを、Bencodeで表現する
1
20:<SHA1 Hashデータ>
Copied!

整数(Number)を扱える

整数は0より大きな値を表現するデータです。「“i” *[0-9] “e”」 という形式で表すことができます。例えば、1024は「i1024e」 と書くことができます。
ファイルのサイズ、ポート番号、といった、数字で表現できる ものに利用します。
2 を、Bencodeで表現する。
1
i2e
Copied!
1024を、Bencodeで表現する
1
i1024e
Copied!
3.14を、Bencodeで表現する
「3.14」BencodeのNumber表見する事ができません。扱えるのは整数値だけです。

リストを扱える

リストは複数のデータを順序ありで保持することができます。 Bencodeでは「"l" "e"」という形式で表すことができます。
例えば、所持してる本、「てんで性悪キューピッド」「幽☆遊☆白書」「レベルE」「HUNTER×HUNTER」といった本の一覧は、個別に Bencodeで表現すると、「22:てんで性悪キューピット」、「12:幽☆遊☆白書」、「7:レベルE」、「13:HUNTER×HUNTER」となります。
これをListで「l22:てんで性悪キューピット12:幽☆遊☆白書7:レベルE13:HUNTER×HUNTERe」とまとめる事ができます。
「あいうえお、かきくけこ」をBencodeで表現する
1
l12:あいうえお12かきくけこe
Copied!
「128、 100、500」を、Bencodeで表現する
1
li128ei100ei500ee
Copied!

辞書

辞書はキーワードとデータを関連づけて保持する事ができます。「 “d” “e”」という形式で表現できます。
例えば、RPGゲームの主人公のパラメータとして、名前、レベル、習得した魔法、といったものが設定されているとしましょう。
名前を勇者、レベルが1、習得した魔法をハリトとカティノとしてみましょう。それぞれBencodeで、「4:名前」「4:勇者」「6:レベル」「i1e」「4:魔法」、「l6:ハリト8:カティノe」と表現できます。 これらをまとめて、「d4:名前4:勇者6:レベルi1e4:魔法l6:ハリト8:カティノee」と辞書で表見できます。
levelが13で、nameが山田、Bencodeで表現する
`` di5:leveli13e4:name4山田e
```

今後の表記について

今後、データ構造を表す場合は、以下の表記を利用します。
リスト 「li512e4:teste」は、[512,"test"]
辞書 「d5:leveli13e5magic6halitoe」は {level:13,magic:"halito"}
Kyorohiro work
Last modified 3yr ago