我如何在* c_char和Vec <u8>之间进行切换

时间:2019-02-08 10:30:40

标签: rust ffi

我有一个Vec<u8>,它伪装成大磁盘:

lazy_static! {
    static ref DISK: Mutex<Vec<u8>> = Mutex::new(vec![0; 100 * 1024 * 1024]);
}

我的Rust代码(直接从C调用)具有一些读写该磁盘的功能,但是我不明白我在那些函数中写的内容以在磁盘和C调用者之间进行内存转移(或者,如果{ {1}}是在此处使用的最佳结构):

Vec

2 个答案:

答案 0 :(得分:5)

使用std::ptr::copy_nonoverlapping

use std::ptr;

// Copy from disk to buffer
extern "C" unsafe fn pread(
    _h: *mut c_void,
    buf: *mut c_char,
    count: uint32_t,
    offset: uint64_t,
    _flags: uint32_t,
) -> c_int {
    // TODO: bounds check
    ptr::copy_nonoverlapping(&DISK.lock()[offset], buf as *mut u8, count);
    count
}

答案 1 :(得分:1)

使用Cstring::from_raw(buf).into_bytes(),反之亦然(documentation)将buf转换为字节片/从字节片转换,然后使用copy_from_slice将数据复制到DISK-此功能内部使用memcpy