相关疑难解决方法(0)

具有位域的C风格结构如何在Rust#[repr(C)]结构中表示?

我有一个C结构定义为:

struct my_c_s {
    u_char          *ptr;
    unsigned        flag_a:1;
    unsigned        flag_b:1;
    int             some_num;
}
Run Code Online (Sandbox Code Playgroud)

怎么会flag_aflag_b代表?

#[repr(C)]
pub struct my_rust_s {
    pub ptr: *const u_char,
    //pub flag_a: ?,
    //pub flag_b: ?,
    pub some_num: ::libc::c_int,
}
Run Code Online (Sandbox Code Playgroud)

我可以将它们声明为bools吗? 或者整个事情需要是一个具有单个字段的位集合,然后我将它们用位掩码?

例如 pub flag_bits: ::libc::c_uint,

c struct rust bit-fields

3
推荐指数
1
解决办法
1055
查看次数

用于低级数据结构的Bitfield和union以及Rust中的类型转换

我需要管理位域数据和联合.这是我认为在C中的代码:

typedef struct __attribute__((__packed__)){
    union {
        struct __attribute__((__packed__)){
            unsigned short protocol : 4;
            unsigned short target : 12;
            unsigned short target_mode : 4;
            unsigned short source : 12;
            unsigned char cmd;
            unsigned char size;
        };
        unsigned char unmap[6]; // Unmapped form.
    };
}header_t;
Run Code Online (Sandbox Code Playgroud)

我使用此联合可以轻松地从映射到未映射的表单切换.我可以写入header_t.protocol或者使用header_t.source它作为u8数组返回header_t.unmap.此开关不使用时间并共享相同的内存块.

我试着在Rust中做同样的事情,但我找不到干净的方法来做到这一点.我成功地使用了两个结构并专门impl在它们之间切换:

#[allow(dead_code)]
pub struct Header {
    protocol:    u8,  // 4 bits used
    target:      u16, // 12 bits used
    target_mode: u8,  // 4 bits used
    source:      u16, …
Run Code Online (Sandbox Code Playgroud)

casting unions rust

3
推荐指数
1
解决办法
190
查看次数

标签 统计

rust ×2

bit-fields ×1

c ×1

casting ×1

struct ×1

unions ×1