ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: agstick

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

  [复制链接]

TA的精华主题

TA的得分主题

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

1)前8个字节是固定的标识,表示这是一个复合文档文件。

00000000H D0 CF 11 E0 A1 B1 1A E1 00 00 00 00 00 00 00 00

2)接着16个字节是唯一标识,其后的4个字节表示修订号和版本号,可不用管它。

00000000H D0 CF 11 E0 A1 B1 1A E1 00 00 00 00 00 00 00 00

00000010H 00 00 00 00 00 00 00 00 3B 00 03 00 FE FF 09 00

3)接下来的2个字节是字节顺序(Byte Order)标识符,总是FEH FFH

00000010H 00 00 00 00 00 00 00 00 3B 00 03 00 FE FF 09 00

4)接着的2个字节表示sector的大小,再2个字节表示short-sector的大小。分别是2^9=512字节和2^6=64字节。

00000010H 00 00 00 00 00 00 00 00 3B 00 03 00 FE FF 09 00

00000020H 06 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00

5)接着的10个字节无有效数据,可忽略。

00000020H 06 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00

6)接着的4个字节表示用于存放扇区配置表(SAT)的sector总数,此例为1个。

00000020H 06 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00

TA的精华主题

TA的得分主题

发表于 2007-3-20 13:48 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
哇呀呀,好复杂。[em04]

TA的精华主题

TA的得分主题

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

7接着的4个字节表示用于存放目录流的第一个sectorSID,这里为sector 10

00000030H 0A 00 00 00 00 00 00 00 00 10 00 00 02 00 00 00

8接着的4个字节无有效数据,可忽略。

00000030H 0A 00 00 00 00 00 00 00 00 10 00 00 02 00 00 00

9)接着的4个字节表示标准流的最小大小这里为00001000H = 4096字节。

00000030H 0A 00 00 00 00 00 00 00 00 10 00 00 02 00 00 00

10)接着的4个字节表示用于存放短扇区配置表(SSAT)的第一个sectorSID,其后4个字节表示用于存放短扇区配置表(SSAT)的sector总数,这里SSATsector 2开始,并只占用1sector

00000030H 0A 00 00 00 00 00 00 00 00 10 00 00 02 00 00 00

00000040H 01 00 00 00 FE FF FF FF 00 00 00 00 00 00 00 00

TA的精华主题

TA的得分主题

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

11)接着的4个字节表示用于存放主扇区配置表(MSAT)的第一个sectorSID,其后的4个字节表示用于存放主扇区配置表(MSAT)的sector总数,这里SID为-2,说明没有附加的sector用于存放MSAT

00000040H 01 00 00 00 FE FF FF FF 00 00 00 00 00 00 00 00

12最后的436个字节包含MSAT的前109SID。只有第一个SID有效,因为上面已经说了SAT只占用1sector。从这里可看出为sector 0。其他的SID标记为Free SID值为-1

00000040H 01 00 00 00 FE FF FF FF 00 00 00 00 00 00 00 00

00000050H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

00000060H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

…… ……

 

2. 主扇区配置表

 

头中已经包含整个MSAT,其SID链为[0,2]

TA的精华主题

TA的得分主题

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

3. 扇区配置表

在此例中扇区配置表仅占用sector 0,它开始于文件偏移量为00000200H = 512字节处。假定内容如下:
00000200H FD FF FF FF FF FF FF FF FE FF FF FF 04 00 00 00
00000210H 05 00 00 00 06 00 00 00 07 00 00 00 08 00 00 00
00000220H 09 00 00 00 FE FF FF FF 0B 00 00 00 FE FF FF FF
00000230H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000240H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000250H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000260H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000270H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000280H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000290H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
000002A0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
000002B0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
000002C0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
000002D0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
000002E0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
000002F0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000300H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000310H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000320H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000330H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000340H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000350H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000360H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000370H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000380H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000390H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
000003A0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
000003B0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
000003C0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
000003D0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
000003E0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
000003F0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

因此可构建SAT的SID数组为:
Array index       0    1    2     3     4    5    6    7    8    9    10     11    12   …
SID array     | –3 | –1 | –2 |  4 |  5 |  6 |  7 |  8 |  9 | –2 |  11 |  –2|  –1| … |

可看出sector 0被标记为SAT SID(-3),sector 1和sector 12及其后的所有sector都未被使用。

TA的精华主题

TA的得分主题

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

4. 短扇区配置表

在头中我们知道SSAT从sector 2开始只占用一个sector。从SAT中可看出位置2的值为-2,表示结束,故SSAT的SID链为[2, –2]。
开始于文件偏移量为00000600H = 1536字节处。
假定内容如下:

00000600H 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00
00000610H 05 00 00 00 06 00 00 00 07 00 00 00 08 00 00 00
00000620H 09 00 00 00 0A 00 00 00 0B 00 00 00 0C 00 00 00
00000630H 0D 00 00 00 0E 00 00 00 0F 00 00 00 10 00 00 00
00000640H 11 00 00 00 12 00 00 00 13 00 00 00 14 00 00 00
00000650H 15 00 00 00 16 00 00 00 17 00 00 00 18 00 00 00
00000660H 19 00 00 00 1A 00 00 00 1B 00 00 00 1C 00 00 00
00000670H 1D 00 00 00 1E 00 00 00 1F 00 00 00 20 00 00 00
00000680H 21 00 00 00 22 00 00 00 23 00 00 00 24 00 00 00
00000690H 25 00 00 00 26 00 00 00 27 00 00 00 28 00 00 00
000006A0H 29 00 00 00 2A 00 00 00 2B 00 00 00 2C 00 00 00
000006B0H 2D 00 00 00 FE FF FF FF 2F 00 00 00 FE FF FF FF
000006C0H FE FF FF FF 32 00 00 00 33 00 00 00 34 00 00 00
000006D0H 35 00 00 00 FE FF FF FF FF FF FF FF FF FF FF FF
000006E0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
000006F0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000700H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000710H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000720H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000730H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000740H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000750H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000760H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000770H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000780H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000790H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
000007A0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
000007B0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
000007C0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
000007D0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
000007E0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
000007F0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
因此可构建SSAT的SID数组为:
 

从sector 54开始所有的short-sectors都未被使用。

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

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

TA的精华主题

TA的得分主题

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

5.目录

 

头中指明用于存放目录流的第一个sectorsector 10。目录总是存放于sector中,而不是short-sector中。故从SAT构建SID链为[10, 11, –2]sector 10的偏移量为00001600H = 5632, sector 11的偏移量为00001800H = 6144。此例中sector的大小为512字节,因此每个sector包含4个目录入口(一个目录入口128字节),故此目录共包含8个入口。

 

<1>根仓库入口(Root Storage Entry

第一个目录入口总是根目录入口,假定其内容如下:

 

00001600H 52 00 6F 00 6F 00 74 00 20 00 45 00 6E 00 74 00

00001610H 72 00 79 00 00 00 00 00 00 00 00 00 00 00 00 00

00001620H 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00001630H 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00001640H 16 00 05 00 FF FF FF FF FF FF FF FF 01 00 00 00

00001650H 10 08 02 00 00 00 00 00 C0 00 00 00 00 00 00 46

00001660H 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00001670H 00 00 00 00 03 00 00 00 80 0D 00 00 00 00 00 00

TA的精华主题

TA的得分主题

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

1)前64字节是此入口名字的字符数组(16位的字符, 以第一个00结束),

       可看出此入口的名字是“Root Entry”

00001600H 52 00 6F 00 6F 00 74 00 20 00 45 00 6E 00 74 00

00001610H 72 00 79 00 00 00 00 00 00 00 00 00 00 00 00 00

00001620H 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00001630H 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

2接着2个字节表示用于存放上述字符数组的有效区域的大小,这里是22字节,只有10个有效字符。

00001640H 16 00 05 00 FF FF FF FF FF FF FF FF 01 00 00 00

3接着1个字节表示入口类型,根仓库入口故为05H

00001640H 16 00 05 00 FF FF FF FF FF FF FF FF 01 00 00 00

4接着1个字节表示入口节点颜色,这里为红色,打破了根仓库入口为黑的规定。

00001640H 16 00 05 00 FF FF FF FF FF FF FF FF 01 00 00 00

5接着4个字节表示其左节点的DID,再接着4个字节表示右节点的DID。对根仓库入口来说都是-1

00001640H 16 00 05 00 FF FF FF FF FF FF FF FF 01 00 00 00

TA的精华主题

TA的得分主题

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

6接着4个字节表示根仓库入口的成员构建的红黑树的根节点的DID,此例为1

00001640H 16 00 05 00 FF FF FF FF FF FF FF FF 01 00 00 00

7接着16个字节表示唯一标识符,说明这是一个仓库,其后4字节表示用户标识,再接着是两个时间标记,各8字节,表明此仓库的创建时间和最后修改时间。这些数据都可忽略。

00001650H 10 08 02 00 00 00 00 00 C0 00 00 00 00 00 00 46

00001660H 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00001670H 00 00 00 00 03 00 00 00 80 0D 00 00 00 00 00 00

8接着4个字节表示短流存放流的第一个sectorSID,其后4字节表示短流存放流的大小。此例中第一个sectorsector 3,其大小为00000D80H = 3456字节。

00001670H 00 00 00 00 03 00 00 00 80 0D 00 00 00 00 00 00

9最后4个字节无有效数据,可忽略。

00001670H 00 00 00 00 03 00 00 00 80 0D 00 00 00 00 00 00

TA的精华主题

TA的得分主题

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

<1>第二个目录入口

第二个目录入口(DID 1)假定其内容如下:

 

00001680H 57 00 6F 00 72 00 6B 00 62 00 6F 00 6F 00 6B 00

00001690H 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

000016A0H 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

000016B0H 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

000016C0H 12 00 02 00 02 00 00 00 04 00 00 00 FF FF FF FF

000016D0H 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

000016E0H 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

000016F0H 00 00 00 00 00 00 00 00 51 0B 00 00 00 00 00 00

 

用颜色标记的为重要数据。入口的名字是“Workbook”,它表示一个流。其左节点的DID2,右节点的DID4。其第一个sectorSID0,其大小是00000B51H = 2897字节,小于4096字节,故其存放于短流存放流中。

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

本版积分规则

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

GMT+8, 2024-3-29 09:56 , Processed in 0.059472 second(s), 8 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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