#read #seek #limited #access #buffered #object #binary-parser

buf_stream_reader

提供对具有有限Seek实现的Read对象的缓冲访问

3个不稳定版本

0.2.0 2022年2月8日
0.1.1 2022年2月7日
0.1.0 2022年2月7日

11 in #seek

Download history 52/week @ 2024-03-11 34/week @ 2024-03-18 13/week @ 2024-03-25 48/week @ 2024-04-01 26/week @ 2024-04-08 25/week @ 2024-04-22 16/week @ 2024-04-29 31/week @ 2024-05-20 58/week @ 2024-05-27 49/week @ 2024-06-03 41/week @ 2024-06-10 7/week @ 2024-06-17 13/week @ 2024-06-24

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]);

无运行时依赖