把C/C++中的结构体(包含位域,即冒号用法)转换成C#中的结构体。

时间:2021-02-16 10:47:06
这里原C里面的结构体代码:
	typedef struct _USER_TYPE_STRUCT
{
UINT8  Power:              4;     /*User Privilege */
UINT8  TempFlg:            1;     /*Reserve*/
UINT8  DuressFlg:          1;     /*Reserve*/
UINT8  Reserve:            2;     /*Reserve*/
} USER_TYPE;

用sizeof(USER_TYPE)测试结果为1;
下面是我自己的转换成C#的代码:
    [StructLayout(LayoutKind.Explicit)]
    public struct USER_TYPE
{
        
        [FieldOffset(0)]
byte  Power;     /*User Privilege */
         [FieldOffset(4)]
byte  TempFlg;     /*Reserve*/
         [FieldOffset(5)]
byte  DuressFlg;     /*Reserve*/
         [FieldOffset(6)]
byte  Reserve;//            2;     /*Reserve*/
        

用Marshal.SizeOf测试结果为7,明显不对啊。
求真相!!!!谢谢!

7 个解决方案

#1


我记得fieldoffset是以字节为单位

#2


关于union 封送,msdn上有详细的解释

#3


引用 1 楼 bigbaldy 的回复:
我记得fieldoffset是以字节为单位


那有没有不是以字节为单位的关键字呀???

#4


不一定要用fileoffset
只要你能通过C#控制这个结构的尺寸,就可以调用

#5


C#里貌似是这样

[Flags]
enum _USER_TYPE_ENUM
{
    Power=0x1,           
    TempFlg=0x10,
    DuressFlg=0x20,
    Reserve=0x40          
}

struct USER_TYPE
{
    _USER_TYPE_ENUM userType;
}

#6


错了,应该是

[Flags]
enum _USER_TYPE_ENUM
{
    Power=0xF,           
    TempFlg=0x10,
    DuressFlg=0x20,
    Reserve=0xC0          
}
 
struct USER_TYPE
{
    _USER_TYPE_ENUM userType;
}

#7


问题解决了吗?

#1


我记得fieldoffset是以字节为单位

#2


关于union 封送,msdn上有详细的解释

#3


引用 1 楼 bigbaldy 的回复:
我记得fieldoffset是以字节为单位


那有没有不是以字节为单位的关键字呀???

#4


不一定要用fileoffset
只要你能通过C#控制这个结构的尺寸,就可以调用

#5


C#里貌似是这样

[Flags]
enum _USER_TYPE_ENUM
{
    Power=0x1,           
    TempFlg=0x10,
    DuressFlg=0x20,
    Reserve=0x40          
}

struct USER_TYPE
{
    _USER_TYPE_ENUM userType;
}

#6


错了,应该是

[Flags]
enum _USER_TYPE_ENUM
{
    Power=0xF,           
    TempFlg=0x10,
    DuressFlg=0x20,
    Reserve=0xC0          
}
 
struct USER_TYPE
{
    _USER_TYPE_ENUM userType;
}

#7


问题解决了吗?