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:36 | 显示全部楼层
本帖已被收录到知识树中,索引项:其他专业开发

第五章    短流

5.1 短流存放流

 

 

当一个流的大小小于指定的值(在头中指定),就称为短流(short-stream)

短流并不是直接使用sector存放数据,而是内含在一种特殊的内部控制流——短流存放流(short-stream container stream)中。

    短流存放流象其他的用户流一样:先从目录中的根仓库入口(root storage entry)获得第一个使用的sector,其SID链从SAT中获得。然后此流将其所占用的sectors分成short-sector,以便用来存放短流。此处也许较难理解,我们来打个比方:既然流组成符合文档,而短流组成短流存放流,这两者是相似的。把短流存放流当作复合文档,那么短流对应流,short-sector对应sector,唯一的不同是复合文档有一个头结构,而短流存放流没有。short-sector的大小在头中已经指定,因此可根据SID计算short-sector相对于短流存放流的偏移量(offset)。公式为:

short_s_pos(SID) = SID ∙ short_s_size = SID ∙ 2 sssz

例:sssz = 6 and SID = 5:

short_s_pos(SID) = SID ∙ 2 sssz = 5 ∙ 26 = 5 ∙ 64 = 320.

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

TA的精华主题

TA的得分主题

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

5.2 短扇区配置表

 

       短扇区配置表(SSATshort-sector allocation table)是一个SID数组,包含所有短流的SID链。与SAT很相似。

       用于存放SSAT的第一个sectorSID在头中指定,其余的SID链从SAT中获得。

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

Offset          Size             Contents                                        

0                  s_size           SSATs_size / 4SID的数组

                                                                     

 

SSAT的用法与SAT类似,不同的是其SID链引用的是short-sector

TA的精华主题

TA的得分主题

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

第六章    目录

 

 

6.1 目录结构

 

 

目录(directory)是一种内部控制流,由一系列目录入口(directory entry)组成。每一个目录入口都指向复合文档的一个仓库或流。目录入口以其在目录流中出现的顺序被列举,一个以0开始的目录入口索引称为目录入口标识(DID: directory entry identifier)

如下图所示:

DIRECTORY ENTRY 0

DIRECTORY ENTRY 1

DIRECTORY ENTRY 2

DIRECTORY ENTRY 3

    目录入口的位置不因其指向的仓库或流的存在与否而改变。如果一个仓库或流被删除了,其相应的目录入口就标记为空。在目录的开始有一个特殊的目录入口,叫做根仓库入口(root storage entry),其指向根仓库。

    目录将每个仓库的直接成员(仓库或流)放在一个独立的红黑树(red-black tree)中。红黑树是一种树状的数据结构,本文仅简单介绍一下,详细情况请参考有关资料。

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

TA的精华主题

TA的得分主题

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

建构一个Red-Black tree的规则:

1. 每个节点(node)的颜色属性不是红就是黑。

2. 根节点一定是黑的

3. 如果某个节点是红的那它的子节点一定是黑的

4. 从根节点到每个叶节点的路径(path必须有相同数目的黑节点。

  ex:                 B               (用图形来解说第,从根节点

                   /     \             到最底层的node你会发现每个

                  B       B            path都恰好有black node)

                 / \    /   \           

                B   B  R     B

               /      / \   / \

              R      B   B R   R

                    / \

                   R   R

注意并不总是执行上述规则。安全的方法是忽略节点的颜色。

TA的精华主题

TA的得分主题

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

例:以第一章中的图为例

1.根仓库入口描述根仓库,它不是任何仓库入口的成员,因此无需构建红黑树。

2.根仓库的所有直接成员(“Storage1”, “Storage2”, “Stream1”, “Stream2”, “Stream3”, “Stream4”)将组成一棵红黑树,其根节点的DID存放于根仓库入口中。

3.仓库Storage1只有一个成员Stream1Stream1构成一棵红黑树,此树只有一个节点。Storage1的目录入口包含Stream1DID

4. 仓库Storage2包含3个成员“Stream21”, “Stream22”, “Stream23”。这3个成员将构建一棵红黑树,其根节点的DID存放于Storage2的目录入口中。

 

这种存放规则将导致每个目录入口都包含3DID

1.在包含此目录入口的红黑树中,此目录入口的左节点的DID

2.在包含此目录入口的红黑树中,此目录入口的右节点的DID

3.若此目录入口表示一个仓库,则还包含此仓库的直接成员所组成的另一颗红黑树的根节点的DID

在构建红黑树的过程中,一个节点究竟作为左还是右,是通过比较其名字来判断的。一个节点比另一个小是指其名字的长度更短,如长度一样,则逐字符比较。

规定:左节点<根节点<右节点。

TA的精华主题

TA的得分主题

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

6.2 目录入口

 

       一个目录入口的大小严格地为128字节,计算其相对目录流的偏移量的公式为:dir_entry_pos(DID) = DID ∙ 128

目录入口的内容:

Offset   Size      Contents                                                 

0          64         此入口的名字(字符数组), 一般为16位的Unicode字符,

         以0结束。(因此最大长度为31个字符)

64         2           用于存放名字的区域的大小,包括结尾的0

         (如:一个名字右5个字符则此值为(5+1)∙2 = 12)

66         1           入口类型: 00H = Empty                 03H = LockBytes (unknown)

01H = User storage       04H = Property (unknown)

02H = User stream        05H = Root storage

67         1           此入口的节点颜色: 00H = Red    01H = Black

68         4           其左节点的DID (若此入口为一个user storage or stream)

         若没有左节点就为-1

72         4           其右节点的DID (若此入口为一个user storage or stream)

          若没有右节点就为-1

76         4           其成员红黑树的根节点的DID (若此入口为storage), 其他为-1

80         16         唯一标识符(若为storage(不重要, 可能全为0)

TA的精华主题

TA的得分主题

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

96         4           用户标记(不重要, 可能全为0)

100       8           创建此入口的时间标记。大多数情况都不写。

108       8           最后修改此入口的时间标记。大多数情况都不写。

116       4           若此为流的入口,指定流的第一个sectorshort-sectorSID,

若此为根仓库入口,指定短流存放流的第一个sectorSID,

其他情况,为0

120       4           若此为流的入口,指定流的大小(字节)

若此为根仓库入口,指定短流存放流的大小(字节)

其他情况,为0

124       4           Not used

                                                                     

TA的精华主题

TA的得分主题

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

时间标记(time stamp) 是一个符号的64位的整数,表示从1601-01-01 00:00:00开始的时间值。此值的单位为107秒。

当计算时间标记是要注意闰年。

例:时间标记值为01AE408B10149C00H

计算步骤                        公式                                 结果                       

转为十进制                                                               t0 =  121,105,206,000,000,000

化成秒的余数                  rfrac = t0 mod 107               rfrac = 0

化成秒的整数                 t1 = t0 / 107                      t1 =  12,110,520,600

化成分的余数                rsec = t1 mod 60                 rsec = 0

化成秒的整数                  t2 = t1 / 60                        t2 =  201,842,010

化成小时的余数              rmin = t2 mod 60                rmin = 30

化成小时的整数             t3 = t2 / 60                        t3 =  3,364,033

化成天的余数                  rhour = t3 mod 24               rhour = 1

化成天的整数                  t4 = t3 / 24                        t4 =  140,168

TA的精华主题

TA的得分主题

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

1601-01-01的整年      ryear = 1601 + t4含的年    ryear = 1601 + 383 = 1984

1984年还剩的天数      t5 = t4 – (1601-01-01        t5 = 140,168 – 139,887 = 281

1984-01-01的天数)

1984-01-01的月数      rmonth = 1 + t5含的月数    rmonth = 1 + 9 = 10

10月还剩的天数          t6 = t5 – (1984-01-01        t6 = 281 – 274 = 7

1984-10-01的天数)

10月最终天数                rday = 1 + t6                       rday = 1 + 7 = 8

最后的结果为1984-10-8 01:30:00。猜猜看这是什么日子……                

TA的精华主题

TA的得分主题

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

第七章 Excel文件实例剖析

这章我们以一个Excel文件作为实例来分析其二进制结构。看实例永远是最好的学习方法,呵呵。

1.复合文档头

首先,读取此文件头,假定此Excel文件的头(512字节)内容如下:
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
00000020H 06 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00
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
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
00000070H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000080H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000090H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
000000A0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
000000B0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
000000C0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
000000D0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
000000E0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
000000F0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000100H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000110H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000120H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000130H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000140H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000150H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000160H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000170H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000180H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00000190H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
000001A0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
000001B0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
000001C0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
000001D0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
000001E0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
000001F0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

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

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-20 16:09 , Processed in 0.050878 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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