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
每月 139 次下载
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