Skip to main content

3.1.1.3. 压缩块 (Compressed Blocks)

要解压压缩块,必须从Block_Header中的Block_Size字段提供压缩大小。

压缩块由两个部分组成:Literals_Section(字面量部分,第3.1.1.3.1节)和Sequences_Section(序列部分,第3.1.1.3.2节)。然后将这两部分的结果组合起来,在序列执行(第3.1.1.4节)中产生解压数据。

要解码压缩块,需要以下元素:

  • 先前解码的数据,最多到Window_Size的距离,或到帧开始,以较小者为准
  • 来自前一个Compressed_Block的"最近偏移量"列表
  • 前一个Huffman树(Treeless_Literals_Block类型需要)
  • 前一个有限状态熵(FSE)解码表(Repeat_Mode需要),用于每种符号类型(字面量长度码、匹配长度码、偏移量码)

3.1.1.3.1. Literals_Section_Header (字面量部分头)

所有字面量都重新组合在块的第一部分。它们可以先解码,然后在序列执行期间复制,或者可以在序列执行期间即时解码。

字面量可以未压缩存储或使用Huffman前缀码压缩。压缩时,可以存在可选的树描述,后跟1个或4个流。

此字段描述字面量如何打包。它是一个字节对齐的可变大小位字段,范围从1到5个字节,使用小端约定。

Literals_Block_Type字段使用第一个字节的最低两位,描述四种不同的块类型:

Literals_Block_TypeValue
Raw_Literals_Block0
RLE_Literals_Block1
Compressed_Literals_Block2
Treeless_Literals_Block3

Raw_Literals_Block: 字面量未压缩存储。

RLE_Literals_Block: 字面量由重复Regenerated_Size次的单字节值组成。

Compressed_Literals_Block: 这是标准Huffman压缩块,以Huffman树描述开始。

Treeless_Literals_Block: 这是Huffman压缩块,使用来自前一个Compressed_Literals_Block的Huffman树,或者如果没有前一个Huffman压缩字面量块则使用字典。

3.1.1.3.2. Sequences_Section (序列部分)

压缩块是一系列序列。序列是字面量复制命令,后跟匹配复制命令。字面量复制命令指定长度。它是要从Literals_Section复制(或提取)的字节数。匹配复制命令指定偏移量和长度。

Sequences_Section重新组合解码命令所需的所有符号。有三种符号类型:字面量长度码、偏移量码和匹配长度码。它们在单个"位流"中交错编码。

Sequences_Section以头部开始,后跟每种符号类型的可选概率表,然后是位流。