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
每月85次下载
用于 webm-iterable
130KB
2K SLoC
EBML 代表可扩展的二进制元语言,类似于XML的二进制版本。它用于容器格式,如 WebM 或 MKV。
重要提示:此crate中包含的迭代器是规范无关的,需要实现
EbmlSpecification
和EbmlTag
特征的规范来读取文件。通常,您只会使用此crate来实现自定义规范 - 最常见的是您更愿意使用提供现有规范的crate,例如 webm-iterable。
[dependencies]
ebml-iterable = "0.6.2"
用法
TagIterator
结构体实现了Rust的 Iterator 特征。此结构体可以使用任何实现标准 Read 特征的源上的 new
函数创建。迭代器根据定义的规范和标签数据输出 TSpec
对象。
注意:可以使用
with_capacity
方法构建具有指定默认缓冲区大小的TagIterator
。如果知道要读取的文件的最大标签大小,则这仅对内存管理有益,是一种微优化。
标签中的数据可以按需进行修改(加密、压缩等),然后使用TagWriter
结构重新编码。该结构可以用实现了标准Write
特质的任何源上的new
函数来创建。一旦创建,这个结构可以使用实现了EbmlSpecification
和EbmlTag
的任何对象的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()
方法),但解析需要实现EbmlSpecification
和EbmlTag
特质的结构。这些特质目前有许多方法需要实现,需要一致的实现以避免错误,因此任何实现尝试都建议使用这个crate中的"derive-spec"
功能标志和提供的宏。自定义规范实现可以参考webm-iterable作为示例。
功能
这个crate目前只有一个可选功能,但随着需求的增加,这可能会改变。
- derive-spec - 当启用时,这提供了一个宏,用于简化实现
EbmlSpecification
和EbmlTag
特性。这引入了对syn
、quote
和proc-macro2
的依赖,因此请预计编译时间会略有增加。
本项目状态
解析和写入完整文件都应该可以正常工作。从版本 0.4.0 开始,现在也支持流式传输(使用未知大小的标签)。如果出现问题,请创建 一个问题。
任何额外的功能请求也可以作为 一个问题 提交。
作者
依赖
~0–350KB