### 微软复合文档格式详解 #### 一、总体介绍 复合文档格式是Microsoft开发的一种文件格式,主要用于存储像Microsoft Office文档这样的复杂数据结构。这种格式允许在一个单一的文件中组织多个逻辑“文件”(即streams)和“目录”(即storages),从而实现了在一个文件中构建一个类似文件系统的结构。复合文档格式对于处理如Office文档这类包含多种类型的数据(如文本、图像等)特别有用。 #### 二、扇区和扇区链 ##### 2.1 扇区和扇区id 复合文档被分割成一系列扇区,每个扇区具有固定大小,并且所有数据都存储在这些扇区内。扇区的ID(SID)是一个32位整数,从0开始递增。非负的SID表示指向文件中的一个有效扇区;而负数的SID通常具有特殊含义: - `-1` 表示空闲扇区(FreeSID)。 - `-2` 表示扇区链的末尾(EndOfChainSID)。 - `-3` 表示扇区包含的是SAT(Sector Allocation Table)的信息。 - `-4` 表示扇区包含的是MSAT(Master Sector Allocation Table)的信息。 ##### 2.2 SID链 为了存储一个流(stream),可能需要使用一个或多个非连续的扇区。SID链是一种有序的SID列表,用于指示存储在文件不同位置的各个扇区。SID链以`-2`作为结束标志。例如,假设一个文档包含两个流A和B,流A存储在SID 0和SID 2中,流B存储在SID 1中,则它们的SID链可能分别为`0, 2, -2`和`1, -2`。 #### 三、复合文档头部 ##### 3.1 头部格式 复合文档的头部位于文件的起始位置,大小为512字节。头部包含了关于整个文档的关键信息,如扇区大小、SID链等。头部的具体格式如下: - **扇区大小**:指定文档中所有扇区的大小。 - **SID链**:定义了如何访问文档中的数据。 - **MSAT SID**:指向MSAT的第一个扇区,除非MSAT不超过109个SID,此时值为`-2`。 - **根目录SID**:指向文档根目录的SID。 ##### 3.2 扇区位置 根据SID可以计算出扇区在文件中的具体位置。计算公式如下: \[ \text{sec_pos(SID)} = 512 + SID \times sec_size = 512 + SID \times 2^{ssz} \] 其中`sec_size`是头部指定的扇区大小,`ssz`是`sec_size`的对数(以2为底)。例如,假设`ssz`为10,SID为5,则该扇区的位置计算为: \[ \text{sec_pos(SID)} = 512 + 5 \times 2^{10} = 512 + 5 \times 1024 = 5632 \] #### 四、分区表 ##### 4.1 Master Sector Allocation Table (MSAT) MSAT是一个包含SID的列表,用于指示Sector Allocation Table (SAT)所在扇区的位置。MSAT的大小等于SAT所占扇区的数量。MSAT的前109个SID存储在头部中,如果超过109个,则剩余部分存储在额外的扇区中。MSAT的每个扇区的最后一个SID指向下一个MSAT扇区,如果没有后续扇区,则为`-2`。 ##### 4.2 Sector Allocation Table (SAT) SAT也是一个SID列表,它包含了所有流的SID链。通过SAT可以找到每个流的所有扇区及其顺序。SAT中的SID可以有以下几种特殊值: - `-1`:表示空闲扇区。 - `-2`:表示SID链的末尾。 - `-3`:表示该扇区包含SAT信息。 - `-4`:表示该扇区包含MSAT信息。 ##### 4.2.1 使用SAT 通过遍历SAT中的SID,可以构造出每个流的SID链。每个SID对应一个扇区,而这个扇区中存储着流的一部分数据。遍历过程遵循以下规则: - 当遇到`-1`时,跳过并继续寻找下一个有效SID。 - 当遇到`-2`时,表示当前流的SID链已经结束。 - 当遇到`-3`或`-4`时,跳过并继续寻找下一个有效SID。 #### 五、Short-Stream 当一个流的长度比正常的扇区大小短时,就会采用Short-Stream的方式进行存储。Short-Stream具有较小的扇区大小,其位置和大小可以在头部中找到。与常规流不同,Short-Stream使用特殊的SID链——Short-Sector Allocation Table (SSAT) 来管理其扇区分配。 Short-Stream的SID链存储在SSAT中,SSAT的结构类似于SAT,但仅用于管理Short-Stream。通过目录的根存储条目可以找到第一个存储Short-Stream的扇区位置。Short-Stream的扇区大小也在头部中有定义。 #### 六、Directory ##### 6.1 Directory结构 复合文档还包含一个目录结构,用于组织和索引文件中的流。目录本身也是一个流,通常被称为根目录。根目录包含一系列子目录条目和文件条目。每个目录条目都包含一个SID,指向该目录的存储位置。 ##### 6.2 目录入口 目录条目提供了访问文件内部结构的方法。每个条目都包含了以下信息: - **SID**:指向该目录或文件的实际存储位置。 - **类型**:标识该条目是一个子目录还是一个文件。 - **名称**:标识该目录或文件的名称。 通过遍历目录条目,可以构建出整个复合文档的目录树结构。每个目录条目都可视为一个节点,从而形成一个层次化的文件系统。这种方式使得复合文档能够支持复杂的文件结构,例如嵌套目录和多个文件。 微软复合文档格式提供了一种强大的方法来组织和存储复杂的数据结构。通过对扇区、SID链、MSAT、SAT以及目录的理解,我们可以有效地解析和操作复合文档中的数据。
- nishuolaizui2020-04-23有点小贵,有一定的参考价值
- 粉丝: 3
- 资源: 37
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助