#data #byte #io #memory-mapped #binary #reference-data #file-io

无 std segsource

一个库,用于使读取任何类型的数据更快、更简单

2 个不稳定版本

0.2.0 2021年7月11日
0.1.0 2021年7月6日

#2806 in 解析器实现

MIT 许可证

83KB
2K SLoC

segsource

Segsource 是一个旨在辅助读取数据的 crate。尽管它专门为二进制(u8)数据设计,但它并不局限于这一点。

概述

Segsource 被设计成可以轻松、高效地读取数据而无需使用太多内存。它是通过两个基本概念实现的:[Source]s,它拥有数据,以及 [Segment]s,它允许访问数据。

每个 [Segment] 都是一个线程安全的 struct,它保留了最小的基础信息,如内部游标的位置(通过 [Segment::current_offset] 方法表示),对此数据的引用等。

特性标志

以下特性可用于 segsource

  1. async,它添加了对使用 tokio 的各种 async 操作的支持。
  2. derive,它包括从 [Segment]s 创建结构体的几个宏。
  3. mmap,它添加了对内存映射文件的支持。
  4. std,它添加了对文件和 I/O 操作的支持。
  5. with_bytes,它添加了对使用 bytes crate 的支持。

在这些特性中,只有 derivestd 默认启用。

为什么选择 segsource?

在类似 segsource 的 crate 中有许多其他选项,在你的用例中,其中一些可能更好。我将介绍一些其他选项,并让你自己决定。

  • bytes:实际上,segsource通过名为bytes的特性提供了对bytescrate的原生支持。虽然bytes很强大,但它确实有其局限性,其中最大的两个是大多数读取操作需要它可变,并且没有返回的方法。Segsource解决了这两个问题。

  • binread:不是作为segsource整体的替代品,而是作为通过derive特性提供的派生。截至本文撰写时,binreadsegsource的派生功能更丰富(并且由于[Segment]s扩展了std::io::Seekstd::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