从文件中快速读取字符串直到 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 上查看。
我有一个二进制文件,它存储像 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 上查看。