书上是这样说的:

数据结构差不多如下:

到此为止,都是可以理解的:

但后面就会让人摸不到头脑,原因就在这里:

这里理解了很久,最后明白了一些,这应该是一种存储方式:

后面的数据,要结合这一串0101……来看,整理过后,应该是这样:

也就是说,上面一行表示那块有表,下面对应的就是表的记录数量:

在取表内容的地方卡了很久,被书里面表描述、列描述给搞晕了,从解析工具来看,和什么描述的数据结构根本就没什么关系:

这里就有一个问题,每个表的结构不同,它是怎么知道后面的数据对应的都是哪一个结构呢?
我本以为是书里没说清楚,可是直到我再dnlib源码里看到了Table的定义:

那么它是如何转换的呢?

终于在源码中找到了答案:

判定的顺序不是内存顺序,而是数字由低到高的顺序:

至此,已经可以找到对应的表顺序,接下来按照各个表的数据结构进行解析就可以了。
定义结构体的时候又发现了问题,同一个表结构,数据类型竟然不一样:

解决办法,老规矩,上源码:(不得不说,c#的代码是越看越流了)

可以看到,数据类型适合bigString、bigGuid、bigBlob有关系的。

最后根据源码确定了是在表头位置存在一个标志,通过位控制符控制字段的数据类型:

至此解析元数据流表的必要条件应该都已经掌握了。
网友评论