复合文档文件格式研究.doc

上传人:灯火****19 文档编号:136883274 上传时间:2020-07-03 格式:DOC 页数:12 大小:156.50KB
返回 下载 相关 举报
复合文档文件格式研究.doc_第1页
第1页 / 共12页
复合文档文件格式研究.doc_第2页
第2页 / 共12页
复合文档文件格式研究.doc_第3页
第3页 / 共12页
复合文档文件格式研究.doc_第4页
第4页 / 共12页
复合文档文件格式研究.doc_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《复合文档文件格式研究.doc》由会员分享,可在线阅读,更多相关《复合文档文件格式研究.doc(12页珍藏版)》请在金锄头文库上搜索。

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

2、储的。本文主要研究复合文档的二进制结构。 目 录第一章 仓库与流(Storages and Streams)第二章 扇区与扇区链(Sectors and Sector Chains)第三章 复合文档头(Compound Document Header)第四章 扇区配置(Sector Allocation)第五章 短流(Short-Streams)第六章 目录(Directory)第七章 Excel文件实例剖析 第一章 仓库与流 复合文档的原理就像一个文件系统(文件系统:如FAT与NTFS)。复合文档将数据分成许多流(Streams),这些流又存储在不同的仓库(Storages)里。将复合文档想

3、象成你的D盘,D盘用的是NTFS(NT File System)格式,流就相当于D盘里的文件,仓库就相当于D盘里的文件夹。 流和仓库的命名规则与文件系统相似,同一个仓库下的流及仓库不能重名,不同仓库下可以有同名的流。每个复合文档都有一个根仓库(root storage)。 例: 第二章 扇区与扇区链 21 扇区与扇区标识 所有的流又分成更小的数据块,叫做数据扇区(sectors)。Sectors 可能包含控制数据或用户数据。 整个文件由一个头(Header)结构以及其后的所有Sectors组成。Sectors的大小在头中确定,且每个Sectors的大小都相同。 以下为示意图: HEADER S

4、ECTOR 0 SECTOR 1 SECTOR 2 SECTOR 3 SECTOR 4 SECTOR 5 SECTOR 6 Sectors 简单的以其在文件中的顺序列举,一个扇区的索引(从0开始)叫做扇区标识(SID:sector identifier)。SID是一个有符号的32位的整型值。 如果一个SID的值非负,就表示真正存在的那个Sector;如果为负,就表示特殊的含义。下表给出有效的特殊SID: SID Name Meaning 1 Free SID 空闲sector,可存在于文件中,但不是任何流的组成部分。 2 End Of Chain SIDSID链的结束标记 (见2.2节) 3

5、SAT SID 此Sector用于存放扇区配置表(SAT)(见4.2节) 4 MSAT SID 此Sector用于存放主扇区配置表(MSAT)(见4.1节) 22 扇区链与扇区标识链 用于存储流数据的所有Sectors的列表叫做扇区链(Sector Chain)。这些Sectors可以是无序的。因此用于指定一个流的Sectors的顺序的SID数组就称为SID chain。一个SID chain总是以End Of Chain SID(2)为结束标记。 例:一个流由4个Sector组成,其SID链为1, 6, 3, 5, 2。 流的SID链是通过扇区配置表构建的(见4.2节),但短流和以下两种内部

6、流除外: 1主扇区配置表,其从自身构建SID链(每个扇区包含下一个扇区的SID)。 2扇区配置表,其通过主扇区配置表构建SID链。 第三章 复合文档头3.1 复合文档头的内容 复合文档头在文件的开始,且其大小必定为512字节。这意味着第一个Sector的开始相对文件的偏移量为512字节。 复合文档头的结构如下: Offset Size Contents 0 8 复合文档文件标识:D0H CFH 11H E0H A1H B1H 1AH E1H 8 16 此文件的唯一标识(不重要, 可全部为0) 24 2 文件格式修订号 (一般为003EH) 26 2 文件格式版本号(一般为0003H) 28 2

7、 字节顺序规则标识(见3.2)::FEH FFH = Little-Endian FFH FEH = Big-Endian 30 2 复合文档中sector的大小(ssz),以2的幂形式存储, sector实际大小为s_size = 2ssz 字节(一般为9即512字节, 最小值为7即128字节) 32 2 short-sector的大小(见5.1),以2的幂形式存储, short-sector实际大 小为s_s_size = 2sssz 字节(一般为6即64字节,最大为sector的大小) 34 10 Not used 44 4 用于存放扇区配置表(SAT)的sector总数 48 4 用于

8、存放目录流的第一个sector的SID (见6) 52 4 Not used 56 4 标准流的最小大小(一般为4096 bytes), 小于此值的流即为短流。60 4 用于存放短扇区配置表(SSAT)的第一个sector的SID (见5.2), 或为2 (End Of Chain SID)如不存在。 64 4 用于存放短扇区配置表(SSAT)的sector总数 68 4 用于存放主扇区配置表(MSAT)的第一个sector的SID (见4.1), 或为2 (End Of Chain SID) 若无附加的sectors。72 4 用于存放主扇区配置表(MSAT)的sector总数 76 436

9、 存放主扇区配置表(MSAT)的第一部分,包含109个SID。3.2 字节顺序(Byte Order) 文件数据的二进制存储有两种方法Little-Endian 和 Big-Endian,但实际应用中只使用Little-Endian方法即:低位8字节存放在地址的低位,高位8字节存放在地址的高位。 例:一个32位的整数13579BDFH(转为十进制即324508639),以Little-Endian存放为DFH 9BH 57H13H,以Big-Endian 存放为 13H 57H 9BH DFH。(H下标表示十六进制) 3.3 扇区偏移量 从头中的信息可以计算出一个sector的偏移量(offs

10、et),公式为: 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的

11、sector数,在头中指明。 MSAT的前109个SID也存放于头中,如果一个MSAT的SID数多余109个,那么多出来的SID将存放于sector中,头中已经指明了用于存放MSAT的第一个sector的SID。在用于存放MSAT的sector中的最后一个SID指向下一个用于存放MSAT的sector,如果没有下一个则为End Of Chain SID(-2)。存放MSAT的sector的内容:(s_size表示sector的大小) Offset Size Contents 0 s_size4 MSAT的(s_size4) / 4个SID的数组 s_size4 4 下一个用于存放MSAT的se

12、ctor的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。第128个SID指向一个用于存放MSAT的sector,假定为sector 6,则sector 6包含剩下的64个SID(最后一个S

13、ID为2,其他的值为1)。 4.2 扇区配置表 扇区配置表(SAT:sector allocation table)是一个SID数组,包含所有用户流(短流除外)和内部控制流(the short-stream container stream, 见5.1, the short-sector allocation table, 见5.2, and the directory, 见7)的SID链。SAT的大小(SID个数)就等于复合文档中所存在的sector的个数。 SAT的建立就是通过按顺序读取MSAT中指定的sector中的内容。 存放SAT的sector的内容:(s_size表示sector的

14、大小) Offset Size Contents 0 s_size SAT的s_size / 4个SID的数组 当通过SAT为一个流创建SID链时,SAT数组的当前位置(array index)表示的就是当前的sector,而该位置存放的SID则指向下一个sector。 SAT可能在任意位置包含Free SID(1),这些sector将不被流使用。如果该位置包含End Of Chain SID(2)表示一个流的结束。如果sector用于存放SAT则为SAT SID(3),同样用于存放MSAT则为MSAT SID(4)。 一个SID链的起点从用户流的目录入口(directory entry,见6.2节)或头(内部控制流)或目录流本身获得。 例:一个复合文档包含一个用于存放SAT的sector(sector 1)和2个流。 Sector 1的内容如

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号