Bencode(発音は「ビーエンコード」)は、P2Pファイル共有システムBitTorrentにおいて、緩やかに構造化されたデータを保存および送信するために使用されるエンコード方式であるThe BitTorrent Protocol Specification BitTorrent.org. Retrieved 8 October 2018。
この形式は以下の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エディタは非常に少ない bencodeファイルはバイナリデータを含むため、またバイナリ文字列の保存形式に関する複雑さから、テキストエディタで安全に編集することは困難である。 多くのbencodeコード群は手動でデコード可能である。しかし、bencode値はしばしばバイナリデータを含むため、デコード作業は非常に複雑になりがちである。bencodeは人間が読みやすいエンコード形式とは見なされていない。 仕様はASCIIセットに含まれる文字のエンコードのみに対処しており、他の文字セットに関する対処はユーザーに委ねられている。これにより解釈が分かれ、一貫性に欠ける結果を生じる。
関連項目 BitTorrent
脚注
外部リンク 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