复合文档格式(三) – 文档头header

  • Post author:
  • Post category:其他


一.概述

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-Endian





Big-Endian method1


存储,但是在一般应用中,仅使用

Little-Endian

方式存储。
2.

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所使用
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 如图:

这里标准流的大小为

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



版权声明:本文为lipinganq原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。