Microsoft Tape Format Specification

数据压缩

MTF 支持除了 填充,Set Map,文件/目录 细节流外的其它流的压缩。 为了启用压缩,备份集内的所有 DBLK 需要设置 MTF_DB_HDR 的块属性的 MTF_COMPRESSION 比特,以及在 MTF_SSET DBLK 的软件压缩算法字段设置合适的的软件压缩算法 ID。 每个备份集只能使用一种压缩算法。

注意:即使没有流被压缩,也需要设置 MTF_COMPRESSION 比特以及软件压缩算法。

为了压缩流数据,流头必须设置流媒介格式字段的 STREAM_COMPRESSED 比特, 以及设置数据压缩字段的值为与 MTF_DB_HDR 的软件压缩字段相同的值。 当一个流头设置为启用压缩,所有的流数据必须被一个压缩帧流头封装。 由于软件压缩的天性,流会很像变长流。

当一个流同时以数据压缩和数据加密写进去,数据会压缩然后加密。 因此,当读取一个即压缩又加密的流,数据需要先解密然后解压。

压缩帧头(MTF_CMP_HDR)

压缩帧头用于封装压缩流数据以及提供解压需要的所有信息。 它必须提供当前压缩帧头所有未压缩时数据的字节数。

偏移字段名类型大小
 0 00h压缩头 IDUINT162 字节
 2 02h流媒介格式属性UINT162 字节
 4 04h剩余的流大小UINT648 字节
12 0Ch未压缩大小UINT324 字节
16 10h压缩大小UINT324 字节
20 15h序号UINT81 字节
21 16h预留- - -1 字节
22 17h校验UINT162 字节
结构 24. 压缩帧头(MTF_CMP_HDR)

压缩头 ID {2 bytes}

压缩头 ID 字段标识这是一个压缩帧头的开始。 压缩头 ID 字段包含一个 2 字的 ASCII 签名 'FH' (0x4846)。

流媒介格式属性

流媒介格式属性字段包含了压缩之前的流头的原始的流媒介格式属性。 解压后,流媒介属性字段的 STREAM_VARIABLE 比特可以用于模仿原始的流状态。

剩余的流大小

剩余的流大小字段在第一个压缩帧头包含了未压缩的流长度。 在接下来的压缩帧头这个字段通过上一个压缩帧头的剩余的流大小字段 减去上一个压缩帧头的未压缩大小得到。 如果总的未压缩流长度无效,这个字段设为 0。

未压缩大小

未压缩大小字段包含了本压缩帧头封装的未压缩时的数据大小。

压缩大小

压缩大小字段本压缩帧头封装的压缩后的数据大小。 有时压缩后数据的大小比未压缩数据要大。 这种情况下,压缩帧头封装的是未压缩的数据然后将压缩大小字段和未压缩大小设为相等。

序号

第一个压缩帧头的序号字段从 1 开始,在接下来的每个压缩帧头加 1。 由于序号字段是 1 字节大小,序号会在每 256 帧回环。

校验

校验字段包含了对所有字段进行按字进行 XOR 操作的总和。 不包括 2 字节的校验字段本身。 这个字段用于在读操作时验证这是一个合法的压缩帧头。