我想读取/解析混合了二进制/文本的数据文件。该文件不是utf_8格式,无法转换。
我的数据文件的 header 结构为:
#[derive(Debug)]
Struct DataParse{
file_num : u16{2},
file_name: char{16},
file_size: u32{4},
file_off: u32{4},
file_dum: u8{1}
}
我将io::Cursor与内存缓冲区和 crate 字节序一起使用,以对我的文件进行操作:use std::io;
use std::io::prelude::*;
use std::fs::File;
use std::path::Path;
use byteorder::{LittleEndian, ReadBytesExt};
use std::io::Cursor;
fn read_parse_file(path_of_file: &str) -> io::Result<()> {
let path = Path::new(&path_of_file);
let display = path.display();
println!("xxx : {}", &display);
let mut f = File::open(&path)?;
let mut buffer = vec![0; 27];
f.read_exact(&mut buffer).unwrap();
let mut vec_pointer = Cursor::new(buffer);
let filenum = vec_pointer.read_u16::<LittleEndian>().unwrap();
let filename = // ?????????
let filesize = vec_pointer.read_u32::<LittleEndian>().unwrap();
let fileoff = vec_pointer.read_u32::<LittleEndian>().unwrap();
let filendum = vec_pointer.read_u8().unwrap();
let dat_binary = DataParse {file_num: filenum, file_name: filename, file_size: filesize, file_off: fileoff, file_dum: filendum };
println!("{:?}", dat_binary);
Ok(())
}
我的问题是,在我的情况下,如何在混合二进制/文本中获取char类型的“Struct file_name”?
最佳答案
感谢@ddulaney为我提供帮助。
fn read_parse_file(path_of_file: &str) -> io::Result<()> {
let path = Path::new(&path_of_file);
let display = path.display();
println!("path is : {}", &display);
let mut f = File::open(&path)?;
let mut buffer = vec![0; 27];
let mut string_buffer = vec![0u8; 16];
f.read_exact(&mut buffer).unwrap();
let mut vec_pointer = Cursor::new(buffer);
let filenum = vec_pointer.read_u16::<LittleEndian>().unwrap();
vec_pointer.read_exact(&mut string_buffer).unwrap();
let mut filename = String::from_utf8(string_buffer).unwrap();
match filename.find('\0'){
None => {},
Some(v) => { filename.truncate(v) },
}
let filesize = vec_pointer.read_u32::<LittleEndian>().unwrap();
let fileoff = vec_pointer.read_u32::<LittleEndian>().unwrap();
let filendum = vec_pointer.read_u8().unwrap();
let dat_binary = DatBinary {file_num : filenum, filename_of_ressource : filename, size : filesize, off : fileoff, dum : filendum};
println!("{:?}", dat_binary);
Ok(())
}
关于rust - 如何使用io::Cursor和字节顺序读取混合的二进制/文本文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65509015/