一.概述
1.上一篇介绍了复合文档仓库和扇区链:
http://blog.csdn.net/lipinganq/article/details/76713880
http://blog.csdn.net/lipinganq/article/details/76713880
2.接下来介绍一下复合文档的头部信息 – Compound Document Header
3.复合文档头(Compound Document Header)包含
开始阅读复合文档文件所需的所有数据
。
开始阅读复合文档文件所需的所有数据
。
二.
Compound Document Header Contents
1.复合文档头始终位于文件的开头,头header大小一定为512字节。这意味着第一个扇区(Sector, SecID为0)在一个文件中的偏移量始终未512
2.复合文档头结构的内容:
三.
Byte Order
1.包含多个字节的所有数据项可以使用
Little-Endian
或
Big-Endian method1
存储,但是在一般应用中,仅使用
Little-Endian
方式存储。
Little-Endian
或
Big-Endian method1
存储,但是在一般应用中,仅使用
Little-Endian
方式存储。
2.
Little-Endian
首先存储最低有效字节,再存储最高有效字节。这适用于所有数据类型,如16位整数,32位整数和Unicode字符。
Little-Endian
首先存储最低有效字节,再存储最高有效字节。这适用于所有数据类型,如16位整数,32位整数和Unicode字符。
3.如:
32位整数:13579BDFH
Little-Endian:DFH 9BH 57H 13H
Big-Endian: 13H 57H 9BH DFH
四.
Sector File Offsets
1.使用复合文档头部的值可以从SecID计算文件的偏移量
1.由于每个扇区(sector)大小size都一样,在复合文档头部定义,如ssz=10,则扇区大小sec_size为2的ssz次方,为1024字节
2.符合文档头部大小固定,为512字节
所以知道SecID的扇区的位置为:
sec_pos(SecID) = 512 + SecID * sec_size = 512 + SecID * 2 ssz(2的ssz次方)
2.如:
已知每个扇区(sector)大小ssz=10,SecID=5,则:
sec_pos(SecID) = 512 + SecID * 2 ssz = 512 + 5 * 210 = 512 + 5 * 1024 = 5632.五u
五.符合文档头说明
1.一个复合文档文件的头信息,512字节如下:
1. 0 – 7 的8个字节
1.1 前8个直接是复合文档文件的标识符:D0 CF 11 E0 A1 B1 1A E1
1.2 如图:
2. 8 – 23的16个字节
2.1 这16个字节表示此文件的唯一标识,不重要,可以全部为0.
2.2 如图:
3. 24 – 25的2个字节
3.1 这2个字节表示此文件格式的修订号,一般为003EH
3.2 如图:
4. 26 – 27的2个字节
4.1 这2个字节表示此文件格式的版本号,一般为0003H
4.2 如图:
5. 28 – 29的2个字节
5.1 这2个字节表示此复合文档文件采用的字节顺序(Byte Order)标识符
FEH FFH 表示Little-Endian
FFH FEH表示Big-Endian
5.2 如图:
6. 30 -31的2个字节
6.1 这2个字节表示的是ssz的大小,此复合文档文件的扇区(sector)的真实大小sec_size为2的ssz次方字节
6.2 ssz的最小值为7,表示扇区最小有128字节,ssz最常用值为9,有512字节
6.3 如图:
7. 32 – 33的2个字节
7.1 这2个字节表示在short-stream container stream中短扇区(short-sector)的sssz大小,短扇区的真实大小short_sec_size为2的sssz次方字节
7.2 最大值是6中定义的扇区的大小,常用值sssz是6,有64字节
7.3 如图:
8. 34 – 43的10个字节
8.1 这10个字节没有用,可忽略
8.2 如图:
9. 44 – 47的4个字节
9.1 这4个字节表示
扇区分配表
(
sector allocation table
SAT)使用的扇区(sector)数,这些扇区被SAT所使用
扇区分配表
(
sector allocation table
SAT)使用的扇区(sector)数,这些扇区被SAT所使用
9.2 如图:
这里SAT只使用了一个扇区(sector): 00H 00H 00H 01H
10. 48 – 51的4个字节
10.1 这4个字节表示目录流( directory stream)中第一个扇区(sector)的SecID,目录directory存储了流的入口
10.2 如图:
这里目录流从第10个扇区开始:00H 00H 00H 0AH
11. 52 – 55的4个字节
11.1 这4个字节没有用,可忽略
11.2 如图:
12. 56 – 59的4个字节
12.1
这4个字节表示标准流(
standard streams
)的最小大小(一般为4096 bytes), 小于此值的流即为短流
这4个字节表示标准流(
standard streams
)的最小大小(一般为4096 bytes), 小于此值的流即为短流
12.2 如图:
这里标准流的大小为
00001000
H
= 4096字节
13. 60 – 63的4个字节
13.1 这4个字节表示短扇区分配表(short-sector allocation table SSAT)的第一个扇区(sector)的SecID
13.2 如果不存在,则为-2.(详情看上一篇:
http://blog.csdn.net/lipinganq/article/details/76713880
)
13.3 如图:
这里SSAT从第2个扇区开始
14. 64 – 67的4个字节
14.1 这4个字节表示
短扇区分配表(
Short-Sector Allocation Table
SSAT)的扇区(sector)总数
14.2 如图:
这里SSAT使用了一个扇区(sector)
15. 68 – 71的4个字节
15.1 这4个字节表示
主扇区分配表
(
Master Sector Allocation Table
MSAT)的第一个扇区(sector)的SecID
15.2 如果为-2表示此复合文档文件中没有扩展MSAT,没有使用附加的扇区(sector)
15.3 如图:
这里的SecID为-2
16. 72 – 75的4个字节
16.1 这4个字节表示
主扇区分配表
(
master sector allocation table
MSAT)的扇区(sector)总数
16.2 如图:
上一个SecID为-2,所以这里MSAT的扇区总数为0
17. 76 – 511的436个字节
17.1 这436个字节表示
主扇区分配表
( master sector allocation table MSAT)的一部分,包含MSAT的前109个SecID
17.2 如图:
由于上文例子中扇区分配表(SAT)仅使用了一个扇区(sector),所以只有第一个SecID才有效,所以其他所有剩余的SecID都设置为-1,表示为特殊的Free SecID。
这里SAT仅使用的扇区为扇区0
六.下一篇
1.下一篇 – 复合文档格式(四) – 主扇区分配表和扇区分配表:
http://blog.csdn.net/lipinganq/article/details/76785471
http://blog.csdn.net/lipinganq/article/details/76785471
版权声明:本文为lipinganq原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。