< 返回版块

WingDust 发表于 2021-11-01 19:39

Tags:ffi,c

use std::os::raw::{c_uchar,c_int,c_char};

#[repr(C)]
#[derive(Debug,Default)]
struct FrameData{
    data:[c_uchar;3],
}

#[link(name="foo")]
extern "C"{
    fn fill(f:*mut FrameData);
}

已经知道 c 端的 uint8_t 对应 Rust 端的 c_uchar

怎么将 uint8_t *这样的字符串指针的原始内容填充到 rust

评论区

写评论
Aya0wind 2021-11-02 11:30

建议和c交互的接口,能用c的类型就用c的类型,这样能少很多麻烦,而且之后你可以选择在上面封装一个使用rust类型的接口。
可以这么写。

use std::os::raw::{c_uchar,c_int,c_char};

#[repr(C)]
#[derive(Debug,Default)]
struct FrameData{
    data:[c_uchar;3],
}
impl FrameData {
    pub fn as_mut_ptr(&mut self)->*mut c_uchar{
        self.data.as_mut_ptr()
    }
}
#[link(name="foo")]
extern "C"{
    fn fill(f:*mut c_uchar);
}
fn main() {
    let mut f = FrameData{data:[1,2,3]};
    unsafe{fill(f.as_mut_ptr());}
}

作者 WingDust 2021-11-02 09:23

--
👇
johnmave126: 所以你问的是C怎么写还是rust怎么写?

都有

johnmave126 2021-11-02 01:21

所以你问的是C怎么写还是rust怎么写?

songzhi 2021-11-02 00:12

memcpy呀

1 共 4 条评论, 1 页