Skip to main content

3.1.1.5. 重复偏移量 (Repeat Offsets)

如上所述,前三个值定义重复偏移量;我们将它们称为Repeated_Offset1、Repeated_Offset2和Repeated_Offset3。它们按最近使用顺序排序,Repeated_Offset1表示"最近使用的"。

如果offset_value为1,则使用的偏移量为Repeated_Offset1,依此类推。

有一个例外:当当前序列的literals_length为0时,重复偏移量移位1,因此offset_value为1意味着Repeated_Offset2,offset_value为2意味着Repeated_Offset3,offset_value为3意味着Repeated_Offset1 - 1_byte。

对于第一个块,起始偏移量历史填充为以下值:Repeated_Offset1 (1)、Repeated_Offset2 (4)和Repeated_Offset3 (8),除非使用字典,在这种情况下它们来自字典。

然后每个块从最近的Compressed_Block的结束值获得其起始偏移量历史。注意,不是Compressed_Block的块被跳过;它们不对偏移量历史做出贡献。

在执行Compressed_Block的序列期间,Repeated_Offsets的值保持更新,以便它们始终表示三个最近使用的偏移量。为了实现这一点,它们在执行每个序列后以以下方式更新:

当序列的offset_value不引用Repeated_Offsets之一时(当其值大于3时,或当其值为3且序列的literals_length为零时),Repeated_Offsets的值向后移位一位,Repeated_Offset1采用刚刚使用的偏移量的值。

否则,当序列的offset_value引用Repeated_Offsets之一时(当其值为1或2时,或当其值为3且序列的literals_length非零时),Repeated_Offsets被重新排序,使得Repeated_Offset1采用使用的Repeated_Offset的值,现有值从第一个Repeated_Offset向后推到offset_value选择的Repeated_Offset。这有效地对这些偏移量的值执行单步环绕旋转,使它们的顺序再次反映它们使用的最近性。