从文件中快速读取字符串直到 0x00

Reading a string from a file until 0x00 fast

我有一个二进制文件,它存储像 chars 这样的字符串,并带有一个用于终止的空字节,我需要将其读入我的程序。字符串看起来像这样: 74 65 73 74 00(“测试”)

这是我当前读取一个字符串的代码:

let mut pointer = (some_offset);
let mut character: u8;
let mut name: String = "".to_string();
loop{
    character = read::read_u8(&path, pointer as usize);
    pointer += 0x01;
    if character == 0{break;}
    name.push(character as char);
}

这是read_u8函数:

pub fn read_u8(filename: &String, offset: usize) -> u8{
    let mut file = std::fs::File::open(filename).unwrap();
    let mut buffer = [0; 1];
    file.seek(SeekFrom::Start(offset as u64)).unwrap();
    file.read(&mut buffer[..]).unwrap() as u8;

    return u8::from_be_bytes(buffer);
}

现在,这很慢。阅读其中的 500 个大约需要 6 秒。有什么方法可以加快这两个代码片段的速度吗?

如果您只对读取单个字节感兴趣,您的 read_u8() 函数可以正常工作,但读取多个字节时效率低下,因为不应关闭和重新打开文件,并且可以缓冲读取调用。

要读取 nul-terminated 个字符串,您应该将文件包装在 BufReader and use .read_until():

use std::fs::File;
use std::io::{BufRead, BufReader, Seek, SeekFrom};

let filename = "./test.bin";
let offset = 0x0100;

let file = File::open(filename).unwrap();
let mut file = BufReader::new(file);
let mut data = Vec::new();
file.seek(SeekFrom::Start(offset)).unwrap();
file.read_until(b'[=10=]', &mut data).unwrap();

// read_until() will include the trailing '[=10=]' unless
// it encounters EOF, just trim it off if its there.
if data.last() == Some(&0) {
    data.pop();
}

let name = String::from_utf8(data);

playground 上查看。