相关疑难解决方法(0)

如何从Rust中的文件中读取结构?

有没有办法可以直接从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从文件中读取配置?这甚至可能吗?

io rust

15
推荐指数
3
解决办法
8023
查看次数

我可以使用字节数组并将其反序列化为结构吗?

我正在从套接字读取一系列字节,我需要将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)?

rust

8
推荐指数
1
解决办法
3137
查看次数

如何分配与缓存行大小对齐的 Vec&lt;u8&gt;?

我需要分配一个缓冲区来读取 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)

并且不会因为对齐问题(例如启动指令)而出现任何恐慌。

rust

2
推荐指数
1
解决办法
1912
查看次数

标签 统计

rust ×3

io ×1