#binary #iterator #numbers #entry #vlq #byte #entries

无 std dev blobby

简单二进制 blob 存储的迭代器

6 个版本

0.3.1 2021 年 12 月 7 日
0.3.0 2020 年 7 月 1 日
0.2.0 2020 年 6 月 13 日
0.1.2 2019 年 1 月 28 日
0.1.1 2018 年 9 月 26 日

83无标准库 中排名

Download history 3499/week @ 2024-03-13 1991/week @ 2024-03-20 2743/week @ 2024-03-27 892/week @ 2024-04-03 838/week @ 2024-04-10 1345/week @ 2024-04-17 1673/week @ 2024-04-24 1377/week @ 2024-05-01 4885/week @ 2024-05-08 3523/week @ 2024-05-15 2672/week @ 2024-05-22 1612/week @ 2024-05-29 1079/week @ 2024-06-05 1268/week @ 2024-06-12 1963/week @ 2024-06-19 1698/week @ 2024-06-26

6,080 每月下载量
110 Crates 中使用 (直接使用 15 个)

MIT/Apache

14KB
273 代码行

遍历简单的二进制 blob 存储。

存储格式

存储格式表示一系列二进制 blob。该格式使用 git 风格的 可变长度数量 (VLQ) 编码无符号数。

文件以去重 blob 的数量 d 开始。之后是 d 条记录。每条记录以整数 m 开始,紧接着是 m 字节表示去重的二进制 blob。

接下来是一系列存储 blob 的记录,数量未指定。每条记录以无符号整数 n 开始。该整数的最低有效位用作标志。如果标志等于 0,则该数之后跟 n >> 1 字节,表示存储的二进制 blob。否则,该条记录引用一个去重记录编号 n >> 1

示例

let buf = b"\x02\x05hello\x06world!\x01\x02 \x00\x03\x06:::\x03\x01\x00";
let mut v = blobby::BlobIterator::new(buf).unwrap();
assert_eq!(v.next(), Some(Ok(&b"hello"[..])));
assert_eq!(v.next(), Some(Ok(&b" "[..])));
assert_eq!(v.next(), Some(Ok(&b""[..])));
assert_eq!(v.next(), Some(Ok(&b"world!"[..])));
assert_eq!(v.next(), Some(Ok(&b":::"[..])));
assert_eq!(v.next(), Some(Ok(&b"world!"[..])));
assert_eq!(v.next(), Some(Ok(&b"hello"[..])));
assert_eq!(v.next(), Some(Ok(&b""[..])));
assert_eq!(v.next(), None);

let mut v = blobby::Blob2Iterator::new(buf).unwrap();
assert_eq!(v.next(), Some(Ok([&b"hello"[..], b" "])));
assert_eq!(v.next(), Some(Ok([&b""[..], b"world!"])));
assert_eq!(v.next(), Some(Ok([&b":::"[..], b"world!"])));
assert_eq!(v.next(), Some(Ok([&b"hello"[..], b""])));
assert_eq!(v.next(), None);

let mut v = blobby::Blob4Iterator::new(buf).unwrap();
assert_eq!(v.next(), Some(Ok([&b"hello"[..], b" ", b"", b"world!"])));
assert_eq!(v.next(), Some(Ok([&b":::"[..], b"world!", b"hello", b""])));
assert_eq!(v.next(), None);

无运行时依赖