TorrentFileの中身
    TorrentファイルはBencodingで記載されている
    Trackerのアドレスが記載されている
    ファイル名が記載されている
    ブロックデータごとのSHA1 Hashが記載されている

Torentファイルを読み込んでみよう

無事、Bencodeのパーサーを書く事ができました。これで、 Torrentファイルの中身を解析できます。Torrentファイルの中身 を確認してみましょう。
さっそく、Torrentファイルを読み込んでみましょう。Parserを 作成していない方は、「https://github.com/kyorohiro/ dart_hetimalib_test/tree/master/hetimalib_sample/TorrentFileParser」を利用してください。
読み込んで見ると以下のようなデータ構成である事がわかりま す。
1
{
2
"announce":http://example.com/tracker,
3
"created by":torrent generator,
4
"creation date":1364723642,
5
"encoding":utf-8,
6
"info":{
7
"length":1024,
8
"name":xxx
9
"piece length":16384,
10
"pieces":<......20バイト単位のバイナリデータ>
11
}
12
}
Copied!

announce

Tracker サーバーのアドレスが記載されています。本アドレス のサーバー にからデータを配信してくれる端末を紹介してもらえます。

created by

本ファイル生成したツールを示す名前のようです。

creation date

本ファイルが生成された日にちを表しているようです。

info.length

配信されているデータのサイズです。1024byte のデータである 事がわかります。

info.name

配信されているデータのファイル名です。xxx という名前であ る事が解ります。

piece length

データを配信する際に、分割するサイズです。16kb単位で分割 する事がわかります。

pieces

分割されたデータごとのHash値です。データーの正当性を判定 するのに使用します。

ファイルが複数の場合

ひとつのファイルを配信するデータは説明した通りです。複数 のファイルをパッケージする場合は、もう少し構造が複雑にな ります。
1
{
2
"announce":http://example.com/tracker,
3
"created by":torrent generator,
4
"creation date":1364723642,
5
"encoding":utf-8,
6
"info":{
7
“files”: [
8
{
9
length:512,
10
path:[aaa, bbb.mp3]
11
},
12
{
13
length:1024,
14
path:[ccc, ddd.mp3]
15
},
16
]
17
"name":xxx
18
"piece length":16384,
19
"pieces":<......20バイト単位のバイナリデータ>
20
}
Copied!
さきほどのと比較すると、info辞書の中に、files リストが増え ています。今回の場合だと、「xxx/aaa/bbb.mp3」、「xxx/ccc/ ddd.mp3」という2つのデータが含まれている事が読み取れま す。

Torrentファイルを作成してみよう

これらの理解できた事を整理して、理解出来ていない事を発見 しながら、Torrentファイルを作成するツールを作成してみまし ょう。無事作成できたならば、だいたいは理解できたという事 になります。既に、Bencoding のパーサーはありますから、ゴ ールは目の前です。
1
{
2
Map file = {};
3
Map info = {};
4
file[TorrentFile.KEY_ANNOUNCE] = announce;
5
file[TorrentFile.KEY_INFO] = info;
6
info[TorrentFile.KEY_NAME] = name;
7
info[TorrentFile.KEY_PIECE_LENGTH] = piececSize;
8
info[TorrentFile.KEY_LENGTH] = targetLength;
9
info[TorrentFile.KEY_PIECE] = pieceBuffer;
10
Bencode.encode(file);
11
}
Copied!
といった感じで、必要な情報をMapに配置して、Bencode にエ ンコードすれば完成です。
実際に作成してみると、明らかでなかった点が現れてきます。 例えば、ファイルが複数ある場合は、pieceデータをどのよう に算出するのでしょうか? まだ、明らかになっていませんでし た。2つ生成する方法を思いつきました。どちらかが、Torrent で採用されている方法だと良いのですが..。
    1.
    ファイル単位で、pieceデータを作成する。
    2.
    複数ファイルは結合してひとつのファイルと見なしてから、pieceデータを作成する。
実際に試してみたところ、 2の方法が採用されているようで す。具体的には、
1
{
2
Blob fileA =...
3
Blob fileB =...
4
Blob image = new Blob([fileA, fileB]);
5
FileReader reader = new FileReader();
6
reader.readAsArrayBuffer(image).then((e){
7
int start = 0;
8
do {
9
int end = start+pieceLength;
10
if(end<image.size()){ end = image.size()}
11
crypto.SHA1 sha1 = new crypto.SHA1();
12
sha1.add(reader.sublist(start,pieceLength));
13
print(sha1.close().toList().toString());
14
start = end;
15
} while(end < image.size()):
16
});
17
}
Copied!
といったコードで生成できます。
Kyorohiro work
Last modified 3yr ago