ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 89680|回复: 103

【学术】复合文档文件格式研究(二进制)---提供pdf下载

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2007-3-20 13:17 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:其他专业开发

复合文档文件格式研究

作者:Agstick          Date: 2007-3-20
     
       Email:agstick@126.com

版权声明:本文仅供个人学习研究,如需复制、转载请注明出处,未经作者许可,不得作任何商业用途。

 

 

前 言

 

 

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

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

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

 

 

目 录

第一章        仓库与流(Storages and Streams

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

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

第四章        扇区配置(Sector Allocation

第五章        短流(Short-Streams

第六章        目录(Directory

第七章        Excel文件实例剖析

 

 

第一章    仓库与流

 

 

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

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

例:

bwYgm8p4.rar (246.07 KB, 下载次数: 4031)


[此贴子已经被作者于2007-4-3 19:12:21编辑过]

【学术】复合文档文件格式研究(二进制)

【学术】复合文档文件格式研究(二进制)

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-3-20 13:21 | 显示全部楼层

第二章    扇区与扇区链

 

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开始)叫做扇区标识(SIDsector 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)

                                                                    

[此贴子已经被作者于2007-3-20 14:02:24编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-3-20 13:23 | 显示全部楼层

 

22 扇区链与扇区标识链

 

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

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

 

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

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

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

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-3-20 13:26 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

第三章    复合文档头

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 字节(一般为9512字节, 最小值为7128字节)

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-3-20 13:28 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

32         2           short-sector的大小(5.1),以2的幂形式存储, short-sector实际大

                            小为s_s_size = 2sssz 字节(一般为664字节,最大为sector的大小)

34         10         Not used

44         4           用于存放扇区配置表(SAT)的sector总数

48         4           用于存放目录流的第一个sectorSID (6)

52         4           Not used

56         4           标准流的最小大小(一般为4096 bytes), 小于此值的流即为短流。

60           4           用于存放短扇区配置表(SSAT)的第一个sectorSID (5.2),

或为–2 (End Of Chain SID)如不存在。

64         4           用于存放短扇区配置表(SSAT)的sector总数

68         4           用于存放主扇区配置表(MSAT)的第一个sectorSID (4.1),

或为–2 (End Of Chain SID) 若无附加的sectors

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-3-20 13:29 | 显示全部楼层

72         4           用于存放主扇区配置表(MSAT)的sector总数

76         436       存放主扇区配置表(MSAT)的第一部分,包含109SID

                                                                                

 

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.

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-3-20 13:30 | 显示全部楼层

第四章    扇区配置

4.1 主扇区配置表

 

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

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

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-3-20 13:31 | 显示全部楼层

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

Offset      Size      Contents                         

         s_size4     MSAT(s_size4) / 4SID的数组

s_size4              下一个用于存放MSATsectorSID,或-2(已为最后一个)

                                                                      

 

 

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

例:一个复合文档需要300sector用于存放SAT,头中指定sector的大小为512字节,这说明一个sector可存放128SIDMAST300SID,前109个放于头中,其余的191个将要占用2sector来存放。此例假定第一个存放MSATsectorsector 1,则sector 1包含127SID。第128SID指向一个用于存放MSATsector,假定为sector 6,则sector 6包含剩下的64SID(最后一个SID为-2,其他的值为-1)。

[此贴子已经被作者于2007-3-20 13:32:39编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-3-20 13:34 | 显示全部楼层

4.2 扇区配置表

 

 

       扇区配置表(SATsector allocation table)是一个SID数组,包含所有用户流(短流除外)和内部控制流(the short-stream container stream, 5.1, the short-sector allocation table, 5.2, and the directory, 7)SIDSAT的大小(SID个数)就等于复合文档中所存在的sector的个数。

       SAT的建立就是通过按顺序读取MSAT中指定的sector中的内容。

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

Offset       Size          Contents                             

            s_size           SATs_size / 4SID的数组

                                                                

    当通过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节)或头(内部控制流)或目录流本身获得。

[此贴子已经被作者于2007-3-20 13:35:21编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-3-20 13:36 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

例:一个复合文档包含一个用于存放SATsectorsector 1)和2个流。

Sector 1的内容如下图:


在位置1其值为-3,表明Sector 1SAT的一部分。

其中一个流为内部目录流,假定头中指定其开始为Sector 0SAT中位置0的值为2,位置2的值为3,位置3 的值为-2。因此目录流的SID链为[0, 2, 3, –2],即此目录流存放于3sector中。

目录中包含一个用户流的入口假定为sector 10,从图中可看出此流的SID链为[10, 6, 7, 8, 9, –2]

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-22 00:43 , Processed in 0.049193 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表