书上是这样说的:
数据结构差不多如下:
到此为止,都是可以理解的:
但后面就会让人摸不到头脑,原因就在这里:
这里理解了很久,最后明白了一些,这应该是一种存储方式:
后面的数据,要结合这一串0101……来看,整理过后,应该是这样:
也就是说,上面一行表示那块有表,下面对应的就是表的记录数量:
在取表内容的地方卡了很久,被书里面表描述、列描述给搞晕了,从解析工具来看,和什么描述的数据结构根本就没什么关系:
这里就有一个问题,每个表的结构不同,它是怎么知道后面的数据对应的都是哪一个结构呢?
我本以为是书里没说清楚,可是直到我再dnlib源码里看到了Table的定义:
那么它是如何转换的呢?
终于在源码中找到了答案:
判定的顺序不是内存顺序,而是数字由低到高的顺序:
至此,已经可以找到对应的表顺序,接下来按照各个表的数据结构进行解析就可以了。
定义结构体的时候又发现了问题,同一个表结构,数据类型竟然不一样:
解决办法,老规矩,上源码:(不得不说,c#的代码是越看越流了)
可以看到,数据类型适合bigString、bigGuid、bigBlob有关系的。
最后根据源码确定了是在表头位置存在一个标志,通过位控制符控制字段的数据类型:
至此解析元数据流表的必要条件应该都已经掌握了。