2 个不稳定版本
0.2.0 | 2021年7月11日 |
---|---|
0.1.0 | 2021年7月6日 |
#2806 in 解析器实现
83KB
2K SLoC
segsource
Segsource 是一个旨在辅助读取数据的 crate。尽管它专门为二进制(u8
)数据设计,但它并不局限于这一点。
概述
Segsource 被设计成可以轻松、高效地读取数据而无需使用太多内存。它是通过两个基本概念实现的:[Source
]s,它拥有数据,以及 [Segment
]s,它允许访问数据。
每个 [Segment
] 都是一个线程安全的 struct,它保留了最小的基础信息,如内部游标的位置(通过 [Segment::current_offset
] 方法表示),对此数据的引用等。
特性标志
以下特性可用于 segsource
async
,它添加了对使用tokio
的各种async
操作的支持。derive
,它包括从 [Segment
]s 创建结构体的几个宏。mmap
,它添加了对内存映射文件的支持。std
,它添加了对文件和 I/O 操作的支持。with_bytes
,它添加了对使用bytes
crate 的支持。
在这些特性中,只有 derive
和 std
默认启用。
为什么选择 segsource?
在类似 segsource 的 crate 中有许多其他选项,在你的用例中,其中一些可能更好。我将介绍一些其他选项,并让你自己决定。
-
bytes
:实际上,segsource
通过名为bytes
的特性提供了对bytes
crate的原生支持。虽然bytes很强大,但它确实有其局限性,其中最大的两个是大多数读取操作需要它可变,并且没有返回的方法。Segsource解决了这两个问题。 -
binread
:不是作为segsource
整体的替代品,而是作为通过derive
特性提供的派生。截至本文撰写时,binread
比segsource
的派生功能更丰富(并且由于[Segment
]s扩展了std::io::Seek
和std::io::Read
,它们将与binread
一起工作]。不幸的是,这又需要传入的 -
bitvec
:你可能已经注意到,你可以用segsource
(例如,你可以有一个初始偏移量,你在偏移量中工作等)基本上执行简单的内存模拟。简单是这里的关键词。 -
std
:你可以使用标准库中的各种项目,例如一个Vec
或一个io::Cursor
,但所有这些都有局限性(例如,一个Vec
不能有初始偏移量,并且只能相对于当前位置移动)。
派生
文档在我的待办事项列表上...
偏移量
segsource使用偏移量而不是索引。根据你的使用情况,这些可能最终是相同的。然而,你可以指定一个初始偏移量,这将基本上将索引从零更改为初始偏移量。
例如
let test_data = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05];
let source = SourceOfYourChoice::from_u8_slice_with_offset(&test_data, 100, Endidness::Big).
unwrap();
let segment = source.all().unwrap();
assert_eq!(segment.u8_at(100).unwrap(), 0);
验证
你可能注意到,我们必须每次都展开值。这是因为方法首先检查偏移量是否有效。例如
assert!(matches!(segment.u8_at(99), Err(Error::OffsetTooSmall { offset :99 })));
许可证:MIT
依赖关系
~1.3–3MB
~58K SLoC