#stream #byte-stream #header-parser #reading #read #data #reader

blockwise_reader

读取第一个字节和大文件或流的预解析

13 个版本 (6 个重大更改)

0.7.4 2024 年 1 月 18 日
0.7.3 2024 年 1 月 3 日
0.6.0 2023 年 12 月 30 日
0.5.0 2023 年 12 月 26 日
0.1.0 2023 年 12 月 16 日

#9 in #header-parser

Download history 29/week @ 2024-03-29 13/week @ 2024-04-05

每月 139 次下载

MIT 许可证

22KB
455

blockwise_reader

读取和预解析大文件或流。

BlockWiseReader 允许您解析文件或流的头部,在这些文件或流中,您不知道需要读取多少字节才能继续解析。

因此,您需要对这个要读取的数量进行合理的猜测。

这里的任务是避免在开始解析之前读取所有数据。

因为有些情况读取太多数据。

对于您想要查找的任何标记或标记序列,您可以决定要读取多少字节。如果您确定,也可以全部读取。

一旦您已经识别出所有需要的部分,您就可以继续使用更高级的解析器(例如 nom、combine、chumsky 或 pest)来解析您收集的字节。

use stringreader::StringReader;
use blockwise_reader::BlockWiseReader;

let sr = StringReader::new(
r#"# Generated by NetworkManager
search localdomain
nameserver 8.8.8.8
"#,
  );

let mut bwr = BlockWiseReader::new(Box::new(sr));

assert!(bwr.slurp_match_repos("# Generated by NetworkManager\n".as_bytes()).unwrap());
assert!(bwr.slurp_find_repos1(1024, b'\n').unwrap());
assert!(bwr.slurp_match_repos("nameserver ".as_bytes()).unwrap());
let pos = bwr.pos_get();
assert!(bwr.slurp_find_repos0(1024, b'\n').unwrap());
assert_eq!( "8.8.8.8".as_bytes(), bwr.get_from_to_current(pos));

也可以按块搜索匹配的固定字节切片。但存在这种风险,即这个字节切片永远不会出现在流中。

use stringreader::StringReader;
use blockwise_reader::BlockWiseReader;
use blockwise_reader::FindPos;

let sr = StringReader::new( r#"Lorem ipsum dolor sit amet, consectetur adipiscing elit, 
 sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 
 Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip 
 ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit 
 esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat 
 non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."#);

let mut bwr = BlockWiseReader::new(Box::new(sr));

// reads repeatedly 100 byte blocks and stops if match appears
assert!(bwr.slurp_search_repos_loop(100, "laborum".as_bytes(), FindPos::Begin).unwrap());
assert_eq!( 447, bwr.pos_get());

依赖项

~19KB