有没有办法可以直接从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?
}
Run Code Online (Sandbox Code Playgroud)
我如何直接config从文件中读取配置?这甚至可能吗?
我正在从套接字读取一系列字节,我需要将n个字节的每个段作为项目放在结构中.
use std::mem;
#[derive(Debug)]
struct Things {
x: u8,
y: u16,
}
fn main() {
let array = [22 as u8, 76 as u8, 34 as u8];
let foobar: Things;
unsafe {
foobar = mem::transmute::<[u8; 3], Things>(array);
}
println!("{:?}", foobar);
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误是24位foobar时的32位错误array.不应该foobar是24位(8 + 16 = 24)?
我需要分配一个缓冲区来读取 a File,但是这个缓冲区必须与缓存行的大小(64 字节)对齐。我正在寻找一个有点像这样的功能Vec:
pub fn with_capacity_and_aligned(capacity: usize, alignment: u8) -> Vec<T>
Run Code Online (Sandbox Code Playgroud)
这将为我提供所需的 64 字节对齐。这显然不存在,但可能有一些我不知道的等价物(即“黑客”)。
所以,当我使用这个函数(它会给我所需的对齐)时,我可以安全地编写这段代码:
#[repr(C)]
struct Header {
magic: u32,
some_data1: u32,
some_data2: u64,
}
let cache_line_size = 64; // bytes
let buffer: Vec<u8> = Vec::<u8>::with_capacity_and_alignment(some_size, cache_line_size);
match file.read_to_end(&mut buffer) {
Ok(_) => {
let header: Header = {
// and since the buffer is aligned to 64 bytes, I wont get any SEGFAULT
unsafe { transmute(buffer[0..(size_of::<Header>())]) }
};
}
}
Run Code Online (Sandbox Code Playgroud)
并且不会因为对齐问题(例如启动指令)而出现任何恐慌。