很久以前在原来的Blog里写的,现在转过来……
昨天看MKV的格式文档的时候知道它用的是EBML格式,研究了一下,觉得挺有意思的
原文对这个格式的描述是:
全是英文……嗯,于是简单说一下,EBML是类似于XML那样的层次化结构,每一个元素都有它的ID(就是元素名)和值。另外由于是二进制存储,还含有一个长度值来记录它的值的长度,每个元素的排列是ID,长度,值
然后它的ID和长度的表示方法很有趣,是采用了UTF-8那样的不定长前缀表示法。转换成二进制后,如果以1开头,那么长度是1字节,如果以01开头就是2字节,001开头是三字节……依此类推。前缀之后的值就是其值(当然,ID就和值无关,只是拿来确定ID的长度了)。
对于元素的值,就采用普通的方法存储。值得注意的是,整数之类的值保存与一般二进制会前后颠倒不同,是按从高到低的顺序存储(例如:对于数0xFE65C4,一般的二进制保存到文件后会变成C4 65 FE,而在EBML里就是以FE 65 C4的形式保存的)
举个例子,这是某MKV文件里的一段:
于是首先看42,转换为2进制值为01000010(注意这里的42是十六进制,别错当成10进制转换成00101010了XD,另外不足8位的用0补齐)。由于是01开头所以知道ID的长度是2字节,于是42 82就是它的ID。之后是长度:88转换为2进制值为10001000,以1开头,于是长度只有1字幕,去掉前缀1后值为0001000,也就是8,即是说后8个字节都是它的值。查表可知ID 42 82也就是DocType,它的值是字符串,于是把后面8字节6D 61 74 72 6F 73 6B 61按UTF-8解码可得“matroska”(由于是英文字符,UTF-8和ASCII码一样XD)。
之后又是一个新元素,同理得知42 87是其ID,长度是81,也就是长为1字节,后面的01就是它的值。同样可查得42 87代表DocTypeVersion,值类型为整数,于是这一段EBML码解析结果为:
DocType=matroska
DocTypeVersion=1
说了半天,EBML是什么?是Extensible Binary Meta Language(可扩展二进制元语言)的缩写,主要是设计用来描述媒体文件的。
至于如何实现层次化描述,等我有心情再写吧XD