复合文档格式(五) - 短流、短流容器流和短扇区分配表

xiaoxiao2021-02-28  82

一.概述

上一篇学习了主扇区分配表和扇区分配表: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^sssz3. 例子 如果sssz=6,SecID=5short_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
转载请注明原文地址: https://www.6miu.com/read-71870.html

最新回复(0)