EBML
読み:イービーエムエル
外語:EBML: Extensible Binary Meta-Language
拡張可能なバイナリのメタ言語。コンテナーフォーマットの一つMatroskaで使うために開発されたバイナリ格納フォーマット。オープンソースのフリーソフトとして公開されている。
XMLのバイナリ版とも呼ばれており、XMLの利点と欠点を内包している。
概要
EBMLでは、XMLの要素を表現する開始タグ〜データ〜終了タグというXML要素構造の代わりに、要素ID・データ長・実際のデータ、という構造を取る。
更に、入れ子構造の場合は、先の「実際のデータ」部が、更に要素ID・データ長・実際のデータ、という構造になる。
技術
数値の表現
要素IDおよびデータ長は可変長のVINTである。
最初のバイトの上位数ビットを用いて、継続する長さを表わす、UTF-8のような方法を採用している。
但し、0と1の使い方が逆である点、途中のバイトをみても先頭バイトか継続バイトか分からない点などが違う。
1バイト目のビット7〜0で長さを表わし、1〜8バイトの可変長である。なお先頭バイト0x00と0xFFは予約されており使用されない。
具体的には、次のように表現できる。
- 0〜0x7Eは、1xxxxxxx(0x8X)
- 0x3FFFまでは、01xxxxxx xxxxxxxx(0x4X 0xXX)
- 0x1FFFFFまでは、001xxxxx xxxxxxxx xxxxxxxx(0x2X 0xXX 0xXX)
- 0xFFFFFFFまでは、0001xxxx xxxxxxxx xxxxxxxx xxxxxxxx(0x1X 0xXX 0xXX 0xXX)
最大は0xFFFFFFFFFFFFFFまでであり、この場合は8オクテットの表現になる。具多的には次のように表現される。
- 00000001 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx(0x01 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX)
表現の例
例えばMatroskaを例とすると、
- EBML要素(0x1A 0x45 0xDF 0xA3)、長さ19バイト(0x93)
- DocType要素(0x42 0x82)、長さ8バイト(0x88)、文字列8バイト "matroska"
- DocTypeVersion要素(0x42 0x87)、長さ1バイト(0x81)、値=1(0x01)
- DocTypeReadVersion要素(0x42 0x85)、長さ1バイト(0x81)、値=1(0x01)
のようになり、その後に次の要素が続く。
XML風に書けばこれは、次のようになっている。
- <ebml>
- <DocType>matroska</DocType>
- <DocTypeVersion>1</DocTypeVersion>
- <DocTypeReadVersion>1</DocTypeReadVersion>
- </ebml>
要素ID
ちなみに要素IDがどのような基準で附番されているのかは全く不明。
EBMLの要素には、子要素・無符号数値・文字列・バイナリ列、のいずれかを含むよう定義されているが、要素IDをみただけでは要素の種類は判断できない。これは要素名を見ただけでは中身が分からないXMLの欠点そのままといえる。
ちなみに、似たような入れ子構造のフォーマットにSNMPがあるが、これは種類数こそ制限はあるものの、要素の種類は分かるよう設計されている。
再検索