ブロックデーターの実装
Bitfieldを実装
BlockDataを実装
ブロック単位でデータを管理するためのコードを書いてみましょう。
Bitfield実装
Bitfieldを実装していきす。 Bitfield Bool値(0, 1)を持つ任意の長さの配列です。
Torrentの場合だと、1がデータを持っている、0がデータを持っていないという事を表します。
class BitfieldSample {
List<bool> _data = [];
BitfieldSample(int length) {
_data = new List.filled(length, false);
}
bool operator [](int idx) => _data[idx];
void operator []=(int idx, bool value) {
_data[idx] = value;
}
int get length => _data.length;
}Torrentはこの値をバイト配列として利用するので、変換するメソッドを用意しておきましょう。
こんな感じです。0x80が先頭Bitで、0x01が末Bit端なのが特徴です。
BlockDataの実装
BlockDataで扱うデータは、メモリーに収まらないことがあります。OSのイメージとかだと1GByteをこえます。ファイルとかで扱うと思います。
しかし、テストを書いたりする場合は、メモリーに収まるデータのみを対象としたほうが扱いやすいですし。場合によっては、ファイルではあるけどねクラウド上のファイルだったりします。
ここでは、以下のような、インターフェイスを利用することにします。
BlockDataは、Blockごとにデータの状態を管理します。なので、blockごとにデータを所持しているか、所持していないかを判断できるようにします。
ブロックごとにデータごとにも書き込み、読み込みの機能を追加します。
これで完成です。
Last updated