复合文档文件格式解析-修复照片,word文件必备知识

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

复合文档文件格式研究

复合文档(Compound Document)是一种不仅包含文本而且包括图形、电子表格数据、声音、视频图象以及其它信息的文档。可以把复合文档想象成一个所有者,它装着文本、图形以及多媒体信息如声音和图象。目前建立复合文档的趋势是使用面向对象技术,在这里,非标准信息如图像和声音可以作为独立的、自包含式对象包含在文档中。Microsoft Windows就是使用这种技术,叫做―OLE2 stora ge file format‖或―Microsoft Office compatible storage file format‖。

当然Excel、Word等都是用这种格式存储的。本文主要研究复合文档的二进制结构,本文的目的就是为另一篇文章《Excel文件格式研究》(创作中)做准备的。

本文是在英文资料的基础上完成的,文中某些术语的翻译可能不够标准,但都会给出英文原名。关于这方面的中文资料网上几乎找不到,如果您有的话,请发到我的邮箱,谢谢。由于本人水平有限,文中错误难免,欢迎大家批评指正。

目录

第一章仓库与流(Storages and Streams

第二章扇区与扇区链(Sectors and Sector Chains

第三章复合文档头(Compound Document Header

第四章扇区配置(Sector Allocation

第五章短流(Short-Streams

第六章目录(Directory

第七章文件实例剖析

第一章仓库与流

复合文档的原理就像一个文件系统(文件系统:如FAT与NTFS)。复合文档将数据分成许多流(Streams),这些流又存储在不同的仓库(Storages)里。将复合文档想象成你的D盘,D盘用的是NTFS(NT File System)格式,流就相当于D盘里的文件,仓库就相当于D盘里的文件夹。

流和仓库的命名规则与文件系统相似,同一个仓库下的流及仓库不能重名,不同仓库下可以有同名的流。每个复合文档都有一个根仓库(root storage)

第二章扇区与扇区链

2.1 扇区与扇区标识

所有的流又分成更小的数据块,叫做数据扇区(sectors)。Sectors 可能包含控制数据或用户数据。

整个文件由一个头(Header)结构以及其后的所有Sectors组成。Sectors的大小在头中确定,且每个Sectors的大小都相同。

以下为示意图:

HEADER

SECTOR 0

SECTOR 1

SECTOR 2

SECTOR 3

SECTOR 4

SECTOR 5

SECTOR 6

Sectors 简单的以其在文件中的顺序列举,一个扇区的索引(从0开始)叫做扇区标识(SID:s ector identifier)。SID是一个有符号的32位的整型值。

如果一个SID的值非负,就表示真正存在的那个Sector;如果为负,就表示特殊的含义。下表给出有效的特殊:

2.2 扇区链与扇区标识链

用于存储流数据的所有Sectors的列表叫做扇区链(Sector Chain)。这些Sectors 可以是无序的。因此用于指定一个流的Sectors 的顺序的SID 数组就称为SID chain 。一个SID chain 总是以End Of Chain SID(-2)为结束标记。

例:一个流由4个Sector组成,其链为[1, 6, 3, 5, –2]

流的SID链是通过扇区配置表构建的(见4.2节),但短流和以下两种内部流除外:

1主扇区配置表,其从自身构建SID链(每个扇区包含下一个扇区的SID)。

2扇区配置表,其通过主扇区配置表构建链。

第三章复合文档头

3.1 复合文档头的内容

复合文档头在文件的开始,且其大小必定为512字节。这意味着第一个Sector的开始相对文件的偏移量为512字节。

3.2 字节顺序(Byte Order)

文件数据的二进制存储有两种方法Little-Endian 和Big-Endian,但实际应用中只使用Little-Endi an方法即:低位8字节存放在地址的低位,高位8字节存放在地址的高位。

例:一个32位的整数13579BDFH(转为十进制即324508639),以Little-Endian存放为DFH 9BH 57H13H,以Big-Endian 存放为13H 57H 9BH DFH。(H下标表示十六进制)

3.3 扇区偏移量

从头中的信息可以计算出一个sector的偏移量(offset),公式为:

sec_pos(SID) = 512 + SID * s_size = 512 + SID * 2 ssz

例:ssz = 10 and SID = 5:

sec_pos(SID) = 512 + SID * 2 ssz = 512 + 5 * 210 = 512 + 5 * 1024 = 5632.

第四章扇区配置

4.1 主扇区配置表

主扇区配置表(MSAT:master sector allocation table)是一个SID数组,指明了所有用于存放扇区配置表(SAT:sector allocation table)的sector的SID。MSAT的大小(SID个数)就等于存放SAT的sector数,在头中指明。

MSAT的前109个SID也存放于头中,如果一个MSAT的SID数多余109个,那么多出来的SI D将存放于sector中,头中已经指明了用于存放MSAT的第一个sector的SID。在用于存放MSAT的sector中的最后一个SID指向下一个用于存放MSAT的sector,如果没有下一个则为End Of Chain SID(-2)。

存放的的内容:(表示的大小)

最后一个存放MSAT的sector可能未被完全填满,空闲的地方将被填上Free SID(-1)。

例:一个复合文档需要300个sector用于存放SAT,头中指定sector的大小为512字节,这说明一个sector可存放128个SID。MAST有300个SID,前109个放于头中,其余的191个将要占用2个sector来存放。此例假定第一个存放MSAT的sector为sector 1,则sector 1包含127个SID。

相关文档
最新文档