bencoding

beencoding というメタフォーマットがある。 BitTorrent で使うファイルや通信プロトコルで使われるフォーマットである。 仕様を見るとわかることだが、実に単純な形式だ。

JSON と比べると人が直接に書くことを想定しておらず、冗長な空白を入れることが出来ない。 また、扱えるオブジェクトの種類も JSON より少ない。 bencoding で云う string は必ずしも文字を構成しないバイト列であることには注意が必要だろう。 string が文字列なのか、文字列だとするとどのような符号化の方式を採用しているのかは bencoding は規定していない。

さて、その bencoding を扱うライブラリを Scheme (R7RS) で書いてみた。

github.com

このライブラリはよっつの手続きを提供する。

(bencoding-parse <binary-input-port>)
ポートから読取ったバイト列をパースしてS式形式のオブジェクトを返す。
(bencoding-construct obj <binary-output-pprt>)
S式形式のオブジェクトから bencoding 形式のバイト列を生成してポートに出力する。
(bencoding-parse-bytevector <bytevector>)
bencoding 形式のバイトベクタをパースしてS式形式のオブジェクトを返す。
(bencoding-construct-bytevector obj)
S式形式のオブジェクトから bencoding 形式のバイトベクタを生成して返す。

Scheme のオブジェクトと bencoding のオブジェクトは以下のように対応付けている。

scheme bencoding
string/bytevector string
list list
vector dictionary
integer integer

Scheme の string と bytevector はいずれも bencoding で云う string にエンコードするが、 bencoding の string は常に Scheme の bytevector にデコードする。 ただし、 bencoding の dictionary のキーとして現れる string に関してのみ Scheme の string としてデコードするようにした。 キーは文字列であった方が利便性がよいという判断と、実際に BitTorrent で使われる中では dictionary のキーは常に ASCII コードの範囲から逸脱することがないからである。

プログラム同士がやりとりするには JSON は冗長すぎると私は感じている。 場合によっては bencoding は手頃な選択肢になりそうだ。

Document ID: 845830058ae6a449054e80b2d4374a9b