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_Type | Value |
|---|---|
| Raw_Literals_Block | 0 |
| RLE_Literals_Block | 1 |
| Compressed_Literals_Block | 2 |
| Treeless_Literals_Block | 3 |
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以头部开始,后跟每种符号类型的可选概率表,然后是位流。