一.概述
- 上一篇学习了主扇区分配表和扇区分配表:http://blog.csdn.net/lipinganq/article/details/76785471
- 在复合文档头中的第56 - 59的4个字节指定了标准流(standard streams )的最小大小(一般为4096 bytes),如果一个流的长度小于此值的流即为短流(Short-Stream)
- 短流不直接使用扇区Sector存储数据,而是全部嵌入到一个特定的内部控制流(internal control stream )中,称其为短流容器流 - short-stream container stream
二.短流容器流 - Short-Stream Container Stream
1. 短流容器流(
short-stream container stream )像任何其他(长)用户流一样存储:
- 第一个使用的扇区必须从目录directory 中的根存储条目(root storage )获取,其SecID链包含在 扇区分配表(SAT)中
- 短流容器流(short-stream container stream )所使用的所有扇区的数据是根据其SecID链的顺序而来的
- 在下一步中,该流实际上被分为短扇区(short-sectors ),类似于主复合文档文件中的扇区,但是没有复合文档头结构。 因此,第一个短扇区short-sector
(SecID为 0)总是位于短流容器流内的偏移量0处。 - 在复合文档头部的第30 -31的2个字节指定了ssz的大小,最小为7,则扇区sector的大小为2的ssz次方
- 在复合文档头部的第32 - 33的2个字节指定了sssz的大小,短扇区的真实大小为2的sssz次方,最大值为扇区的大小,详情看:http://blog.csdn.net/lipinganq/article/details/76737002
2. 复合文档
头中包含短扇区的大小。 利用该信息,可以根据SecID计算短扇区在短流容器流中的偏移量:
- short_sec_pos表示SecID对应的短扇区在短流容器流中的位置
- short_sec_size表示短扇区的大小
- sssz就是复合文档头中第32 - 33的2个字节指定了sssz的大小,则短扇区真实大小为2^sssz
short_sec_pos(SecID) = SecID ∙ short_sec_size = SecID ∙ 2^sssz
3. 例子
- 如果sssz=6,SecID=5
- short_sec_pos(SecID) = SecID ∙ 2 ^sssz = 5 ∙ 2^6 = 5 ∙ 64 = 320
三.短扇区分配表 - Short-Sector Allocation Table
1.
短扇区分配表(
short-sector allocation table SSAT)跟SAT类似,也是一个存储SecID的数组,包含
所有短流的SecID链,类似扇区分配表SAT包含标准流的SecID链
2. SSAT所使用的扇区中的第一个扇区的SecID在复合文档的
头中指定了,由第60 - 63的4个字节指定,其余SecID链包含在扇区分配表SAT中
3. SSAT是通过read和串联所有占据的扇区的内容构建的
4. 一个SSAT占据的扇区的内容:
- sec_size表示一个扇区的大小,单位为字节
- 则SSAT占据的扇区可以存储sec_size/4个SecID
5. SSAT的使用与SAT类似,区别在于SSAT中的SecID链指短流容器流中的短扇区
四.总结
1. 短扇区分配表存储了短扇区的SecID,短扇区分配表扇区就是被SSAT所占据的扇区,即SSAT所使用的的扇区
2. SSAT使用的扇区的第一个扇区的SecID从复合文档头中获取
3. SSAT由SAT管理,获得SSAT使用的扇区的第一个扇区的SecID后,通过扇区之间形成的链,可以获得SSAT所使用的所有扇区,形成完整的SSAT
五.下一篇
下一篇 - 复合文档格式(六) - 目录Directory :
http://blog.csdn.net/lipinganq/article/details/76828145