3.1.1.2. Blocks (块)
在 Magic_Number 和 Frame_Header 之后,有若干个块。每个帧必须至少有 1 个块,但每帧的块数没有上限。
块的结构如下:
+==============+===============+
| Block_Header | Block_Content |
+==============+===============+
| 3 bytes | n bytes |
+--------------+---------------+
表 8: 块的结构
Block_Header 使用 3 个字节,使用小端约定编写。它包含三个字段:
| Last_Block | Block_Type | Block_Size |
|---|---|---|
| bit 0 | bits 1-2 | bits 3-23 |
表 9: Block_Header
3.1.1.2.1. Last_Block (最后块)
最低位(Last_Block)表示这是否是最后一个块。帧将在此最后一个块之后结束。它后面可能跟着可选的 Content_Checksum(参见第 3.1.1 节)。
3.1.1.2.2. Block_Type (块类型)
接下来的 2 位表示 Block_Type。有四种块类型:
| Value (值) | Block_Type (块类型) |
|---|---|
| 0 | Raw_Block (原始块) |
| 1 | RLE_Block (RLE块) |
| 2 | Compressed_Block (压缩块) |
| 3 | Reserved (保留) |
表 10: 四种块类型
Raw_Block (原始块) : 这是一个未压缩的块。Block_Content 包含 Block_Size 字节。
RLE_Block (RLE块) : 这是一个单字节,重复 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 表示此字节必须重复的次数。
Block_Size 受 Block_Maximum_Size 限制(见下文)。
3.1.1.2.4. Block_Content and Block_Maximum_Size (块内容和块最大大小)
Block_Content 的大小受 Block_Maximum_Size 限制,它是以下两者中较小的一个:
- Window_Size
- 128 KB
Block_Maximum_Size 对于给定帧是恒定的。此最大值适用于帧中任何块的解压缩大小和压缩大小。
此限制的理由是解码器可以在帧开头读取此信息并使用它来分配缓冲区。对块大小的保证确保缓冲区对于有效帧的任何后续块都足够大。
如果压缩块大于未压缩块,则建议改为发送未压缩块(即 Raw_Block)。