Bencode

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

Category:BitTorrent
Category:データシリアライゼーションフォーマット