3.1.1.2. 块 (Blocks)
在Magic_Number和Frame_Header之后,有一些数量的块。每个帧必须至少有1个块,但每帧的块数没有上限。
块的结构如下:
+==============+===============+
| Block_Header | Block_Content |
+==============+===============+
| 3 bytes | n bytes |
+--------------+---------------+
Block_Header使用3个字节,使用小端约定编写。它包含三个字段:
| Last_Block | Block_Type | Block_Size |
|---|---|---|
| bit 0 | bits 1-2 | bits 3-23 |
3.1.1.2.1. Last_Block (最后块)
最低位(Last_Block)表示这是否是最后一个块。帧将在此最后一个块之后结束。它可能后跟可选的Content_Checksum。
3.1.1.2.2. Block_Type (块类型)
接下来的2位表示Block_Type。有四种块类型:
| Value | Block_Type |
|---|---|
| 0 | Raw_Block |
| 1 | RLE_Block |
| 2 | Compressed_Block |
| 3 | Reserved |
Raw_Block: 这是一个未压缩的块。Block_Content包含Block_Size字节。
RLE_Block: 这是一个单字节,重复Block_Size次。Block_Content由一个字节组成。在解压端,此字节必须重复Block_Size次。
Compressed_Block: 这是第3.1.1.3节中描述的压缩块。Block_Size是Block_Content的长度,即压缩数据。解压大小未知,但保证其最大可能值。
Reserved: 这不是一个块。此值不能用于当前规范。如果存在这样的值,则被视为损坏的数据,符合规范的解码器必须拒绝它。
3.1.1.2.3. Block_Size (块大小)
Block_Header的高21位表示Block_Size。
当Block_Type为Compressed_Block或Raw_Block时,Block_Size是Block_Content的大小(因此不包括Block_Header)。
当Block_Type为RLE_Block时,由于Block_Content的大小始终为1,Block_Size表示此字节必须重复的次数。
3.1.1.2.4. Block_Content和Block_Maximum_Size
Block_Content的大小受Block_Maximum_Size限制,它是以下两者中的较小者:
- Window_Size
- 128 KB
Block_Maximum_Size对于给定帧是常数。此最大值适用于帧中任何块的解压大小和压缩大小。