复合文档文件格式研究

前 言

 

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

当然Excel、Word等都是用这种格式存储的。本文主要研究复合文档的二进制结构。

目 录

第一章        仓库与流(Storages and Streams)

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

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

第四章        扇区配置(Sector Allocation)

第五章        短流(Short-Streams)

第六章        目录(Directory)

第七章        Excel文件实例剖析

 

 

第一章    仓库与流

 

复合文档的原理就像一个文件系统(文件系统:如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:sector identifier)。SID是一个有符号的32位的整型值。

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

SID   Name                   Meaning                                          

–1   Free SID             空闲sector,可存在于文件中,但不是任何流的组成部分。

–2    End Of Chain SID      SID链的结束标记 (见2.2节)

–3   SAT SID                此Sector用于存放扇区配置表(SAT)(见4.2节)

–4   MSAT SID          此Sector用于存放主扇区配置表(MSAT)(见4.1节)

 

2.2 扇区链与扇区标识链

 

用于存储流数据的所有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节),但短流和以下两种内部流除外:

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            字节顺序规则标识(见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            用于存放目录流的第一个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        存放主扇区配置表(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的偏移量(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个,那么多出来的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_size-4       MSAT的

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值