#ebml #parser #serialization #binary-data #encoding #format #object

ebml-iterable

此crate提供了一个EBML编码数据的迭代器。迭代器提供的项目是EBML中定义的标签。迭代器是规范无关的,需要实现特定特征的规范来读取文件。通常,您只会使用此crate来实现自定义规范 - 最常见的是您更愿意使用提供现有规范的crate,例如 webm-iterable

14次发布

0.6.2 2024年4月4日
0.6.1 2024年2月27日
0.6.0 2023年10月20日
0.5.0 2023年2月13日
0.3.0 2021年7月15日

#1 in #ebml

Download history 8/week @ 2024-04-26 18/week @ 2024-05-03 10/week @ 2024-05-10 47/week @ 2024-05-17 102/week @ 2024-05-24 21/week @ 2024-05-31 38/week @ 2024-06-07 22/week @ 2024-06-14 18/week @ 2024-06-21 9/week @ 2024-06-28 16/week @ 2024-07-05 15/week @ 2024-07-12 7/week @ 2024-07-19 11/week @ 2024-07-26 49/week @ 2024-08-02

每月85次下载
用于 webm-iterable

MIT 许可证

130KB
2K SLoC

EBML 代表可扩展的二进制元语言,类似于XML的二进制版本。它用于容器格式,如 WebMMKV

重要提示:此crate中包含的迭代器是规范无关的,需要实现 EbmlSpecificationEbmlTag 特征的规范来读取文件。通常,您只会使用此crate来实现自定义规范 - 最常见的是您更愿意使用提供现有规范的crate,例如 webm-iterable

[dependencies]
ebml-iterable = "0.6.2"

用法

TagIterator 结构体实现了Rust的 Iterator 特征。此结构体可以使用任何实现标准 Read 特征的源上的 new 函数创建。迭代器根据定义的规范和标签数据输出 TSpec 对象。

注意:可以使用 with_capacity 方法构建具有指定默认缓冲区大小的 TagIterator。如果知道要读取的文件的最大标签大小,则这仅对内存管理有益,是一种微优化。

标签中的数据可以按需进行修改(加密、压缩等),然后使用TagWriter结构重新编码。该结构可以用实现了标准Write特质的任何源上的new函数来创建。一旦创建,这个结构可以使用实现了EbmlSpecificationEbmlTag的任何对象的write方法来编码EBML,不论它们是否来自TagIterator。这将向底层的Write目标输出二进制EBML。

主枚举

大多数标签类型直接包含它们的数据,但在EBML中存在一种称为Master的标签类别,其中包含其他标签。这个crate包含三种不同分类的主标签的枚举

  • Start是“主”标签开始的标记。
  • End是“主”标签结束的标记。
  • Full(children)是一个完整的标签,包括Master标签的所有子标签。这仅由通过tags_to_buffer传入的标签类型传递给TagIterator时发出。

TagDataType

pub enum TagDataType {
    Master,
    UnsignedInt,
    Integer,
    Utf8,
    Binary,
    Float,
}

TagDataType是一个枚举,包含存储在标签中的可能数据类型。标签变体与标签中包含的数据类型之间的关系由所使用的规范定义。由于EBML是二进制格式,需要正确的规范来解析标签内容。

  • Master:包含任意数量子标签的完整主标签。
  • UnsignedInt:无符号整数。
  • Integer:有符号整数。
  • Utf8:Unicode文本字符串。请注意,EBML规范包括一个单独的元素类型用于ASCII。鉴于ASCII是Utf8的子集,这个库目前使用相同的Utf8逻辑解析和编码这两种类型。
  • Binary:二进制数据,否则不解释。
  • Float:IEEE-754浮点数。

注意:这个库有意决定不解析EBML中的“日期”元素,因为Rust中没有内置的日期支持。规范实现应将日期元素视为二进制,以便消费者可以选择使用他们选择的库解析未更改的数据,如果需要的话。

规范实现

基于EBML的任何规范都可以使用这个库来解析或写入二进制数据。写入不需要特殊处理(如果您使用write_raw()方法),但解析需要实现EbmlSpecificationEbmlTag特质的结构。这些特质目前有许多方法需要实现,需要一致的实现以避免错误,因此任何实现尝试都建议使用这个crate中的"derive-spec"功能标志和提供的宏。自定义规范实现可以参考webm-iterable作为示例。

功能

这个crate目前只有一个可选功能,但随着需求的增加,这可能会改变。

  • derive-spec - 当启用时,这提供了一个宏,用于简化实现 EbmlSpecificationEbmlTag 特性。这引入了对 synquoteproc-macro2 的依赖,因此请预计编译时间会略有增加。

本项目状态

解析和写入完整文件都应该可以正常工作。从版本 0.4.0 开始,现在也支持流式传输(使用未知大小的标签)。如果出现问题,请创建 一个问题

任何额外的功能请求也可以作为 一个问题 提交。

作者

Austin Blake

依赖

~0–350KB