.net文件结构之元数据流

书上是这样说的:

.net文件结构之元数据流_第1张图片

数据结构差不多如下:

.net文件结构之元数据流_第2张图片

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

.net文件结构之元数据流_第3张图片

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


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

.net文件结构之元数据流_第4张图片

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

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

.net文件结构之元数据流_第5张图片

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

.net文件结构之元数据流_第6张图片

这里就有一个问题,每个表的结构不同,它是怎么知道后面的数据对应的都是哪一个结构呢?

我本以为是书里没说清楚,可是直到我再dnlib源码里看到了Table的定义:

.net文件结构之元数据流_第7张图片

那么它是如何转换的呢?

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

.net文件结构之元数据流_第8张图片

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

.net文件结构之元数据流_第9张图片

至此,已经可以找到对应的表顺序,接下来按照各个表的数据结构进行解析就可以了。

定义结构体的时候又发现了问题,同一个表结构,数据类型竟然不一样:

.net文件结构之元数据流_第10张图片

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

.net文件结构之元数据流_第11张图片

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

.net文件结构之元数据流_第12张图片

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

.net文件结构之元数据流_第13张图片

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

你可能感兴趣的:(.net文件结构之元数据流)