コンテンツにスキップ

Bencode

出典: フリー百科事典『ウィキペディア(Wikipedia)』

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において発生しうるエラーは以下のとおりである:

  1. ルート値がnullである。
  2. ルート項目が単一でない。
  3. 無効な型を検出('i'、'l'、'd'、あるいは'0'~'9'以外の文字)。
  4. 'i'、'l'、または'd'型に対応する終端記号'e'の欠如。
  5. 整数に関するエラー:
    1. 数字以外の文字が含まれている。
    2. 先頭にゼロがある。
    3. 負のゼロである。
  6. バイト文字列に関するエラー:
    1. 負の長さ。
    2. 長さの後に':'がない。
    3. 文字列の完了前に予期せぬEOF。
  7. 辞書に関するエラー:
    1. キーが文字列でない。
    2. キーが重複している。
    3. キーが辞書順に並んでいない。
    4. キーに対応する値が存在しない。

特徴

[編集]

Bencodeは非常に特化された形式のバイナリコーディングであり、いくつかの独自の特性を持っている:

  • 各(複雑な)値に対して有効なbencodeは一意である。すなわち、値とそのエンコードとの間に全単射が存在する。これにより、アプリケーションは値をデコードせずに、エンコード形式を比較することで値の比較が可能となる。
  • Bencodingは、JSONYAMLといったデータ言語と類似した用途を持ち、複雑ながらも緩やかに構造化されたデータをプラットフォーム非依存な形で保存することができる。これにより複雑なデータに対して線形メモリ上の保存が可能となる。

欠点

[編集]

しかし、この一意性は以下のような問題を引き起こす可能性がある:

  • Bencodeエディタは非常に少ない[2]
  • bencodeファイルはバイナリデータを含むため、またバイナリ文字列の保存形式に関する複雑さから、テキストエディタで安全に編集することは困難である。
  • 多くのbencodeコード群は手動でデコード可能である。しかし、bencode値はしばしばバイナリデータを含むため、デコード作業は非常に複雑になりがちである。bencodeは人間が読みやすいエンコード形式とは見なされていない。
  • 仕様はASCIIセットに含まれる文字のエンコードのみに対処しており、他の文字セットに関する対処はユーザーに委ねられている。これにより解釈が分かれ、一貫性に欠ける結果を生じる。

関連項目

[編集]

脚注

[編集]
  1. ^ The BitTorrent Protocol Specification Archived 2019-07-26 at the Wayback Machine. BitTorrent.org. Retrieved 8 October 2018
  2. ^ BEncode Editor”. μTorrent Community Forums (2007年10月8日). 2014年10月24日時点のオリジナルよりアーカイブ。2014年10月24日閲覧。

外部リンク

[編集]