未来のいつか/hyoshiokの日記

hyoshiokの日々思うことをあれやこれや

TLV -- Tag Length Value

古典的なデータ構造としてTLVというのがある。Tag Length Valueの3つ組。
Tagの部分にデータ型をいれ、Length部分にOctet長を、Valueのところに実際の値をいれるというデータ構造である。このTLVというのは非常に扱いやすいのでネットワークのプロトコルとか、データベースのエンジンとかいろいろなところで利用されている。
Tagによっていろいろ特別なオペレーションを定義できるので簡単に処理を特殊化できたりする。プログラムのコードとしてはcaseとかswitchとかで、あるTagだったら、なんちゃらという処理を追加していけばいい。知らないTagが来たら知らないという処理をすればいいので、安全にTagを拡張追加できる。未定義のTagが出てきたら、すなわち知らないTagでてきたら、Length分データをすっ飛ばせば、取りあえず知らないふりができる。まあ、なんらかのデフォルトの処理をするんだろうけど、安全に無視できる。これ重要である。
なんかObject Orientedですな。Object Oriented ってどういう意味か知らないけど。Lisp的ですな。どういう意味か知らないけど。
それはともかく、データ構造としてはTagが出てきた瞬間、潔く、あ、これ知らない、と判定できるのがいい。
で、唐突に文字コードの話になるんだけど文字列もTLVで表現したら幸せになれる。Tagに文字コードを示す何がしかをいれて(エンコーディングなのか単なる文字集合なのか、それとも他のものなのかは十分吟味すればいいのだけど、ともかくその手の何か)、Lengthには厳密に8ビットで数えた長さを入れ、実際の値をValueに入れる。
ある文字列が等しいかどうかは、Tagが等しければバイナリに比較すればいいし、違うTagの場合はTagの組み合わせルールに従って等価性を定義すればいい。文字列の大小なども同様にいろいろ定義をしていけばいい。
これってCSI -- Code Set Independent な実装に他ならない。
だからどうなのって話なのだがCSIの実装とTLVというのは相性がいいということを指摘して今日はおしまいなり。