3个不稳定版本
0.2.0 | 2022年2月8日 |
---|---|
0.1.1 | 2022年2月7日 |
0.1.0 | 2022年2月7日 |
11 in #seek
110 每月下载次数
用于 2 crates
16KB
104 代码行,不包括注释
buf_stream_reader
这个结构体提供了一个具有有限Seek
实现的缓冲访问到Read
对象。换句话说,BufStreamReader
将一个Read
转换成一个Read
+Seek
,可以与二进制解析器如binread
(这也是我创建这个crate的原因)一起使用。
Seeking受以下约束限制
- 仅缓冲少量字节(由[
BufStreamReader::new
]的buffer_size
参数定义) - 我们不知道流的结尾,不支持使用
SeekFrom::End
- 只有目标位置在当前缓冲区内部时才允许向后Seek
尽可能向后Seek,直到当前缓冲区有数据
use std::io::{Cursor, Read, Seek, SeekFrom};
use buf_stream_reader::BufStreamReader;
let cursor = Cursor::new(&arr); // points to array with values from \x00 .. \xff
let mut reader = BufStreamReader::new(cursor, 16);
let mut buffer: [u8; 7] = [0; 7];
/* straightly reading 7 bytes works */
assert_eq!(reader.read(&mut buffer).unwrap(), buffer.len());
assert_eq!(&buffer, &arr[0..7]);
/* seeking backwards inside the current buffer */
assert!(reader.seek(SeekFrom::Current(-4)).is_ok());
assert_eq!(reader.read(&mut buffer).unwrap(), 7);
assert_eq!(&buffer, &arr[3..10]);
如果目标不在当前缓冲区内部或其后,则无法向后Seek
let cursor = Cursor::new(&arr); // points to array with values from \x00 .. \xff
let mut reader = BufStreamReader::new(cursor, 16);
let mut buffer: [u8; 7] = [0; 7];
assert!(reader.seek(SeekFrom::Start(96)).is_ok());
assert!(reader.seek(SeekFrom::Start(95)).is_err());
assert!(reader.seek(SeekFrom::Current(-1)).is_err());
向前Seek不受限制,以及超出缓冲区限制的读取(当然,只要数据可用)
let cursor = Cursor::new(&arr); // points to array with values from \x00 .. \xff
let mut reader = BufStreamReader::new(cursor, 16);
let mut buffer: [u8; 7] = [0; 7];
assert!(reader.seek(SeekFrom::Start(10)).is_ok());
assert_eq!(reader.read(&mut buffer).unwrap(), buffer.len());
assert_eq!(&buffer, &arr[10..17]);
assert!(reader.seek(SeekFrom::Current(122)).is_ok());
assert_eq!(reader.read(&mut buffer).unwrap(), buffer.len());
assert_eq!(&buffer, &arr[139..146]);