有没有一种方法可以直接从Rust中的文件读取结构?我的代码是:
use std::fs::File;
struct Configuration {
item1: u8,
item2: u16,
item3: i32,
item4: [char; 8],
}
fn main() {
let file = File::open("config_file").unwrap();
let mut config: Configuration;
// How to read struct from file?
}
我将如何从文件中将配置直接读取到
config
中?这有可能吗? 最佳答案
干得好:
use std::io::Read;
use std::mem;
use std::slice;
#[repr(C, packed)]
#[derive(Debug, Copy, Clone)]
struct Configuration {
item1: u8,
item2: u16,
item3: i32,
item4: [char; 8],
}
const CONFIG_DATA: &[u8] = &[
0xfd, // u8
0xb4, 0x50, // u16
0x45, 0xcd, 0x3c, 0x15, // i32
0x71, 0x3c, 0x87, 0xff, // char
0xe8, 0x5d, 0x20, 0xe7, // char
0x5f, 0x38, 0x05, 0x4a, // char
0xc4, 0x58, 0x8f, 0xdc, // char
0x67, 0x1d, 0xb4, 0x64, // char
0xf2, 0xc5, 0x2c, 0x15, // char
0xd8, 0x9a, 0xae, 0x23, // char
0x7d, 0xce, 0x4b, 0xeb, // char
];
fn main() {
let mut buffer = CONFIG_DATA;
let mut config: Configuration = unsafe { mem::zeroed() };
let config_size = mem::size_of::<Configuration>();
unsafe {
let config_slice = slice::from_raw_parts_mut(&mut config as *mut _ as *mut u8, config_size);
// `read_exact()` comes from `Read` impl for `&[u8]`
buffer.read_exact(config_slice).unwrap();
}
println!("Read structure: {:#?}", config);
}
Try it here(已针对Rust 1.38更新)
但是,您需要注意,因为不安全的代码是不安全的。在
slice::from_raw_parts_mut()
调用之后,同时存在两个对同一数据的可变句柄,这违反了Rust别名规则。因此,您需要在尽可能短的时间内将创建的可变切片保留在结构之外。我还假设您了解字节序问题-上面的代码绝不是可移植的,并且如果在不同类型的机器(例如ARM与x86)上编译并运行,它们将返回不同的结果。如果可以选择格式并且想要紧凑的二进制格式,请考虑使用bincode。否则,如果您需要要解析一些预定义的二进制结构,byteorder crate是可行的方法。
关于io - 如何从Rust中的文件读取结构?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25410028/