Bencode
表示
Bencode(発音は「ビーエンコード」)は、P2Pファイル共有システムBitTorrentにおいて、緩やかに構造化されたデータを保存および送信するために使用されるエンコード方式である[1]。
この形式は以下の4種類の値をサポートしている:
Bencodingはトレントファイルにおいて最も一般的に使用されており、BitTorrentの仕様の一部をなしている。これらのメタデータファイルは単にbencode形式の辞書である。
Bencodingは単純であり(数値が10進表記のテキストとしてエンコードされるため)エンディアンの影響を受けない。これはBitTorrentのようなクロスプラットフォームアプリケーションにとって重要である。また、アプリケーションが予期しない辞書のキーを無視する限り、柔軟性も高く、新しいキーを追加しても互換性を損なうことがない。
エンコードアルゴリズム
[編集]BencodeはASCII文字を区切りとして使用し、数字でデータ構造を単純かつコンパクトにエンコードする。
- 整数は
i<10進整数>e
という形式でエンコードされる。- 整数は10進表記でエンコードされ、先頭にハイフンを付けて負数を表現できる。
- 先頭のゼロは許されない(ただし0は例外)。
- 例:
- ゼロは
i0e
とエンコードされる。 - 数値42は
i42e
とエンコードされる。 - 負の42は
i-42e
とエンコードされる。
- ゼロは
- バイト文字列は
<長さ>:<内容>
という形式でエンコードされる。- 長さは文字列のバイト数であり、10進表記でエンコードされる。
- コロン(
:
)で長さと内容を区切る。 - 内容は長さで指定されたバイト数と正確に一致する。
- 例:
- 空文字列は
0:
とエンコードされる。 - 文字列"bencode"は
7:bencode
とエンコードされる。
- 空文字列は
- リストは
l<要素>e
という形式でエンコードされる。l
で始まりe
で終わる。- 要素はbencode形式の値であり、区切りなしに連結される。
- 例:
- 空リストは
le
とエンコードされる。 - 文字列"bencode"と整数-20を含むリストは
l7:bencodei-20ee
とエンコードされる。
- 空リストは
- 辞書は
d<ペア>e
という形式でエンコードされる。d
で始まりe
で終わる。- キーと値のペアを含む。
- キーはバイト文字列であり、辞書順に並べる必要がある。
- 各キーの直後に対応する値を配置する。値の型は任意のbencode形式でよい。
- 例:
- 空の辞書は
de
とエンコードされる。 - キー"wiki" → "bencode"および"meaning" → 42の辞書は
d7:meaningi42e4:wiki7:bencodee
とエンコードされる。
- 空の辞書は
リストおよび辞書の中に格納できる値の型には制限がなく、他のリストや辞書を含めることもできるため、任意に複雑なデータ構造を構築することができる。
Bencodeにおけるエラーの種類
[編集]形式が不正なbencodeにおいて発生しうるエラーは以下のとおりである:
- ルート値がnullである。
- ルート項目が単一でない。
- 無効な型を検出('i'、'l'、'd'、あるいは'0'~'9'以外の文字)。
- 'i'、'l'、または'd'型に対応する終端記号'e'の欠如。
- 整数に関するエラー:
- 数字以外の文字が含まれている。
- 先頭にゼロがある。
- 負のゼロである。
- バイト文字列に関するエラー:
- 負の長さ。
- 長さの後に':'がない。
- 文字列の完了前に予期せぬEOF。
- 辞書に関するエラー:
- キーが文字列でない。
- キーが重複している。
- キーが辞書順に並んでいない。
- キーに対応する値が存在しない。
特徴
[編集]Bencodeは非常に特化された形式のバイナリコーディングであり、いくつかの独自の特性を持っている:
- 各(複雑な)値に対して有効なbencodeは一意である。すなわち、値とそのエンコードとの間に全単射が存在する。これにより、アプリケーションは値をデコードせずに、エンコード形式を比較することで値の比較が可能となる。
- Bencodingは、JSONやYAMLといったデータ言語と類似した用途を持ち、複雑ながらも緩やかに構造化されたデータをプラットフォーム非依存な形で保存することができる。これにより複雑なデータに対して線形メモリ上の保存が可能となる。
欠点
[編集]しかし、この一意性は以下のような問題を引き起こす可能性がある:
- Bencodeエディタは非常に少ない[2]
- bencodeファイルはバイナリデータを含むため、またバイナリ文字列の保存形式に関する複雑さから、テキストエディタで安全に編集することは困難である。
- 多くのbencodeコード群は手動でデコード可能である。しかし、bencode値はしばしばバイナリデータを含むため、デコード作業は非常に複雑になりがちである。bencodeは人間が読みやすいエンコード形式とは見なされていない。
- 仕様はASCIIセットに含まれる文字のエンコードのみに対処しており、他の文字セットに関する対処はユーザーに委ねられている。これにより解釈が分かれ、一貫性に欠ける結果を生じる。
関連項目
[編集]脚注
[編集]- ^ The BitTorrent Protocol Specification Archived 2019-07-26 at the Wayback Machine. BitTorrent.org. Retrieved 8 October 2018
- ^ “BEncode Editor”. μTorrent Community Forums (2007年10月8日). 2014年10月24日時点のオリジナルよりアーカイブ。2014年10月24日閲覧。
外部リンク
[編集]- Bencoding specification
- File_Bittorrent2 - Another PHP Bencode/decode implementation
- The original BitTorrent implementation in Python as standalone package
- Torrent File Editor cross-platform GUI editor for BEncode files
- bencode-tools - a C library for manipulating bencoded data and a XML schema like validator for bencode messages in Python
- Bento - Bencode library in Elixir.
- Beecoder - the file stream parser that de/encoding "B-encode" data format on Java using java.io.* stream Api.
- Bencode parsing in Java
- Bencode library in Scala
- Bencode parsing in C
- There are numerous Perl implementations on CPAN