我有一個二進制檔案,它存盤像字符這樣的字串,帶有一個用于終止的空位元組,我需要將其讀入我的程式。字串看起來像這樣:
74 65 73 74 00("test")
這是我當前的代碼,它讀取一個字串:
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 秒。有什么辦法可以加快這兩個代碼片段的速度嗎?
uj5u.com熱心網友回復:
如果您只對讀取單個位元組感興趣,則您的read_u8()函式可以正常作業,但讀取多個位元組效率低下,因為不應關閉和重新打開檔案,并且可以緩沖讀取呼叫。
要讀取以 nul 結尾的字串,您應該將檔案包裝在 a 中BufReader并使用.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'\0', &mut data).unwrap();
// read_until() will include the trailing '\0' unless
// it encounters EOF, just trim it off if its there.
if data.last() == Some(&0) {
data.pop();
}
let name = String::from_utf8(data);
在操場上看到它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/458926.html
下一篇:如何更改MATLAB的默認格式?
