3.1.2. Skippable Frames (可跳过帧)
+==============+============+===========+
| Magic_Number | Frame_Size | User_Data |
+==============+============+===========+
| 4 bytes | 4 bytes | n bytes |
+--------------+------------+-----------+
表 19: 可跳过帧
可跳过帧允许将用户定义的元数据插入到连接帧的流中。
此规范中定义的可跳过帧与 [LZ4] 中的可跳过帧兼容。
从兼容解码器的角度来看,可跳过帧只需要被跳过,其内容被忽略,在可跳过帧之后恢复解码。
应该注意的是,可跳过帧可用于给连接帧流添加水印,嵌入任何类型的跟踪信息(甚至只是通用唯一标识符 (UUID))。警惕此类可能性的用户应扫描连接帧流,以尝试检测此类帧以进行分析或删除。
字段说明
Magic_Number (魔数)
大小: 4 字节,小端格式
值: 0x184D2A5?,表示从 0x184D2A50 到 0x184D2A5F 的任何值
所有 16 个值都有效地标识可跳过帧。此规范不详细说明可跳过帧的任何特定标记方法。
魔数范围:
- 最小值: 0x184D2A50
- 最大值: 0x184D2A5F
- 总共: 16 个有效魔数
Frame_Size (帧大小)
大小: 4 字节,小端格式,无符号 32 位
含义: 后续 User_Data 的大小(以字节为单位)(不包括魔数和大小字段本身)
这意味着 User_Data 不能大于 (2^32 - 1) 字节。
最大 User_Data 大小: 4,294,967,295 字节(约 4 GB)
User_Data (用户数据)
大小: 可变(由 Frame_Size 指定)
内容: 任意数据
此字段可以是任何内容。数据将被解码器跳过。
使用场景
1. 元数据嵌入
- 版本信息
- 创建时间戳
- 作者信息
- 许可证数据
2. 水印和追踪
- UUID 嵌入
- 来源追踪
- 分发渠道标识
3. 应用特定数据
- 自定义头部
- 应用程序配置
- 扩展信息
兼容性说明
解码器行为
符合规范的解码器必须:
- 识别魔数: 检测 0x184D2A5? 范围内的魔数
- 读取大小: 解析 Frame_Size 字段
- 跳过数据: 跳过 Frame_Size 字节的 User_Data
- 继续解码: 在可跳过帧后继续处理
编码器建议
编码器可以:
- 任意放置: 在帧流的任何位置插入可跳过帧
- 多个帧: 插入多个可跳过帧
- 自定义标记: 使用 16 个魔数中的任何一个进行内部标记
安全考虑
隐私问题
可跳过帧可能用于:
- 跟踪数据流
- 嵌入隐藏信息
- 识别数据来源
建议措施
对于关注隐私的用户:
- 扫描检测: 扫描输入流以检测可跳过帧
- 分析内容: 检查 User_Data 的内容
- 选择性删除: 根据需要删除可跳过帧
- 日志记录: 记录检测到的可跳过帧以供审计
示例
嵌入 UUID
Magic_Number: 0x184D2A50
Frame_Size: 16 (0x10000000, 小端)
User_Data: [16 字节 UUID]
嵌入时间戳
Magic_Number: 0x184D2A51
Frame_Size: 8
User_Data: [8 字节 Unix 时间戳]
与 LZ4 的兼容性
可跳过帧格式与 LZ4 兼容,允许:
- 跨格式工具互操作
- 统一的元数据处理
- 简化的解码器实现
注意: 可跳过帧不影响解压缩数据的内容,仅影响流的元数据。