我有一个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_a和flag_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中的代码:
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)