我正在处理一个项目,该项目涉及从文件中以不同的偏移量阅读不同的信息。
目前,我使用的是以下代码:
// ------------------------ SECTORS PER CLUSTER ------------------------
// starts at 13
opened_file.seek(SeekFrom::Start(13)).unwrap();
let aux: &mut [u8] = &mut [0; 1];
let _buf = opened_file.read_exact(aux);
// ------------------------ RESERVED SECTORS ------------------------
// starts at 14
opened_file.seek(SeekFrom::Start(14)).unwrap();
let aux: &mut [u8] = &mut [0; 2];
let _buf = opened_file.read_exact(aux);
但是正如您所看到的,我需要创建一个新的缓冲区,其大小是我每次都要读取的,我不能直接将其指定为函数的参数。
我试着创建一个结构体,但是我无法创建一个包含所有不同数据的结构体。例如:
struct FileStruct {
a1: &mut [u8] &mut [0; 1],
a2: &mut [u8] &mut [0; 2],
}
read_exact
方法工作需要哪些类型?
有没有一种更有效的方法可以从文件的不同偏移读取信息,而不必为我想从文件中读取的每一条信息重复复制粘贴这些代码行?有没有某种函数/光标/向量可以轻松地在偏移周围移动?有没有一种方法可以将这些信息写入结构域?
3条答案
按热度按时间2wnc66cl1#
最简单的方法是拥有一个拥有数组的结构体,然后查找并读入该结构体。
Playground link
这仍然是相当重复的,所以可以创建一个
seek_read
函数来减少重复:Playground link
使用宏可以进一步降低重复次数:
Playground link
mwngjboj2#
这是对Aplet 123的补充回答:不太清楚你 * 必须 * 将字节原样存储到一个结构中,所以你也可以分配一个缓冲区(作为一个固定大小的数组),并在大小正确的切片中重用它。
你也可以使用the byteorder crate,它可以让你使用directly read numbers or sequences of numbers,它基本上只做不依赖的“创建适当大小的堆栈缓冲区;阅读;解码”。
这一点特别有用,因为它看起来很像“每个群集的扇区”应该是u8,“保留扇区”应该是u16。使用
byteorder
,您可以直接使用read_16()
或read_u8()
。ffx8fchx3#
同样基于Aplet123的答案,下面的函数
seek_read
不需要知道在编译时要读取多少字节,因为它使用Vector而不是字节片:以下是一些测试,用于演示
seek_read
的行为: