3.1.1.1. 帧头 (Frame Header)
帧头的大小可变,最小2字节,最大14字节,具体取决于可选参数。Frame_Header的结构如下:
+-------------------------+-----------+
| Frame_Header_Descriptor | 1 byte |
+-------------------------+-----------+
| [Window_Descriptor] | 0-1 byte |
+-------------------------+-----------+
| [Dictionary_ID] | 0-4 bytes |
+-------------------------+-----------+
| [Frame_Content_Size] | 0-8 bytes |
+-------------------------+-----------+
3.1.1.1.1. Frame_Header_Descriptor (帧头描述符)
头部的第一个字节称为Frame_Header_Descriptor。它描述了哪些其他字段存在。解码此字节足以确定Frame_Header的大小。
该字段包含以下位字段(第7位是最高位,第0位是最低位):
- Bit 7-6: Frame_Content_Size_Flag
- Bit 5: Single_Segment_Flag
- Bit 4: (unused) 未使用
- Bit 3: (reserved) 保留
- Bit 2: Content_Checksum_Flag
- Bit 1-0: Dictionary_ID_Flag
Frame_Content_Size_Flag
这是一个2位标志(相当于Frame_Header_Descriptor右移6位),指定是否在头部中提供Frame_Content_Size(解压数据大小)。
Single_Segment_Flag
如果设置了此标志,数据必须在单个连续内存段内重新生成。在这种情况下,跳过Window_Descriptor字节,但Frame_Content_Size必然存在。
Content_Checksum_Flag
如果设置了此标志,帧末尾将存在32位Content_Checksum。
Dictionary_ID_Flag
这是一个2位标志(= Frame_Header_Descriptor & 0x3),指示是否在头部中提供字典ID。它还指定此字段的大小为DID_Field_Size:
| Dictionary_ID_Flag | 0 | 1 | 2 | 3 |
|---|---|---|---|---|
| DID_Field_Size | 0 | 1 | 2 | 4 |
3.1.1.1.2. Window Descriptor (窗口描述符)
这提供了关于解压帧所需的最小内存缓冲区的保证。此信息对于解码器分配足够的内存很重要。
最小内存缓冲区大小称为Window_Size。它由以下公式描述:
windowLog = 10 + Exponent;
windowBase = 1 << windowLog;
windowAdd = (windowBase / 8) * Mantissa;
Window_Size = windowBase + windowAdd;
最小Window_Size为1 KB。最大Window_Size为(1<<41) + 7*(1<<38)字节,即3.75 TB。
3.1.1.1.3. Dictionary_ID (字典ID)
这是一个可变大小的字段,包含正确解码帧所需的字典ID。此字段是可选的。当不存在时,由解码器决定使用哪个字典。
Dictionary_ID字段大小由DID_Field_Size提供。格式为小端。
3.1.1.1.4. Frame_Content_Size (帧内容大小)
这是原始(未压缩)大小。此信息是可选的。Frame_Content_Size使用可变数量的字节,由FCS_Field_Size提供。格式为小端。