复合文档格式(三)

来源:互联网 发布:php培训费用 编辑:程序博客网 时间:2024/05/23 16:55

一.概述

1.上一篇介绍了复合文档仓库和扇区链: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-EndianBig-Endian method1存储,但是在一般应用中,仅使用Little-Endian方式存储。
2.Little-Endian首先存储最低有效字节,再存储最高有效字节。这适用于所有数据类型,如16位整数,32位整数和Unicode字符。
3.如:
32位整数:13579BDFHLittle-Endian:DFH 9BH 57H 13HBig-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所使用
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), 小于此值的流即为短流
12.2 如图:
这里标准流的大小为00001000H= 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