rust - 如何使用io::Cursor和字节顺序读取混合的二进制/文本文件?

标签 rust

我想读取/解析混合了二进制/文本的数据文件。该文件不是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/

相关文章:

rust - 如何将泛型 T 的实例转换为 Rust 中的具体实例?

generics - 为什么在为结构实现特征时得到 "missing lifetime specifier"或 "wrong number of type arguments"?

io - 如何正确读取文本文件?

generics - Rust:从(仅)<T> 不同的函数返回通用结构

rust - 为什么 !Send 在 .await 之前被 drop() 丢弃的值意味着 Future 是 !Send?

regex - 如何在 Rust 中使用正则表达式从右侧查找?

rust - 遍历选项的内容或特定值

rust - Rust Gnuplot-将PNG以字节为单位保存在内存中

rust - 使用 Cargo 构建 WebAssembly 模块时为 "Error loading target specification"

rust - 在没有不安全 block 的情况下调用 WinAPI