gpt4 book ai didi

具有混合位标志和普通成员的结构

转载 作者:行者123 更新时间:2023-11-29 08:08:36 27 4
gpt4 key购买 nike

我正在尝试为 FFI 在 Rust 中重新创建一个具有混合位域成员和“普通”成员的 C 结构。

我读到 bitflags crate将是一个合适的选择,不幸的是,我发现文档缺乏关于语法实际工作方式的信息。

bitflags crate 使得创建位掩码的方式与在 C 中使用枚举的方式类似。 bitfield crate声称要创建可以访问的位域,但我不知道它是如何工作的。

我有一个这样的 C 结构:

struct mixed {
unsigned int flag_1_1 : 1;
unsigned int flag_2_7 : 7;
unsigned int flag_3_8 : 8;

unsigned int some_val1;
unsigned int some_val2;

unsigned int flag_4_16 : 16;
};

我不知道如何在 Rust 中表示它,我会使用 crate libc访问 c_uint,但除此之外,我目前几乎没有想法,并且找到其他执行此操作的代码尚未证明是成功的:

#[repr(transparent)] // do I also need repr(C) ?
struct mixed {
flags_1_3: mixed_flags_1_3;
some_val1: c_uint;
some_val2: c_uint;
flags_4: mixed_flags_4;
}

bitfield!(
#[repr(transparent)] // do I also need repr(C), here too?
struct mixed_flags_1_3(u16 /* what about this parameter? */) {
u8; // what does this mean?
/* get/field, set: first bit, last bit; */
flag_1_1, _: 0, 0;
flag_2_7, _: 7, 1;
flag_3_8, _: 15, 8;
}
)

bitfield!(
#[repr(transparent)]
struct mixed_flags_4(u8) {
u8;
flag_4_16, _: 15, 0;
}
)

这些只是猜测,如何创建正确的表示?

最佳答案

在这种情况下,您可以通过 bindgen 查看生成的代码:

$ bindgen test.h

#[repr(C)]
#[derive(Copy, Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub struct __BindgenBitfieldUnit<Storage, Align>
where
Storage: AsRef<[u8]> + AsMut<[u8]>,
{
storage: Storage,
align: [Align; 0],
}

//skipped code with access method for bit fields

#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct mixed {
pub _bitfield_1: __BindgenBitfieldUnit<[u8; 2usize], u8>,
pub some_val1: ::std::os::raw::c_uint,
pub some_val2: ::std::os::raw::c_uint,
pub _bitfield_2: __BindgenBitfieldUnit<[u8; 2usize], u16>,
pub __bindgen_padding_0: u16,
}

关于具有混合位标志和普通成员的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49140221/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com