C#如何实现C++中的联合体union

时间:2022-06-01 20:03:18
	union {
uint32 u32value;
struct {
uint32 isDead : 1; // [0,1] physical, Magic
uint32 inCombat : 1;
uint32 justRevived : 1;
uint32 isLoaded : 1;
uint32 _pad : 28;
};
} m_statusFlags;


C#里面是否有什么bitmask之类的类型,可以设置数据的位。

谢谢

9 个解决方案

#1


[StructLayout(LayoutKind.Explicit)]
class A
{
    [FieldOffset(0)]
    public uint u32Value;

    [FieldOffset(0)]
    public MyStruct something;
}

#2


这个东西只能用掩码的&运算进行取值了,直接传个UINT32就行了

#3


楼上的貌似正确。。。学习了

#4


引用 3 楼 baesky 的回复:
楼上的貌似正确。。。学习了

如果都是值类型的话或许可以,否则可能编译通不过,而且
  [System.Runtime.InteropServices.FieldOffset(0)]
  public double d;

  [System.Runtime.InteropServices.FieldOffset(0)]
  public float f1;
  [System.Runtime.InteropServices.FieldOffset(32)]
  public float f2;
类似这样的话,f2似乎不能正确赋值(以前试过好像是这样)
参见: 如何实现类似于c语言中的共用体

#5


引用 1 楼 gomoku 的回复:
[StructLayout(LayoutKind.Explicit)]
class A
{
  [FieldOffset(0)]
  public uint u32Value;

  [FieldOffset(0)]
  public MyStruct something;
}


正解。

#6


他的Struct是要取UINT32的位的,StructLayout肯定不行,因为它只能控制到字节,

就放一个UINT32进去就可以了,

取值时_pad的值等于(u32value & 0xFFFFFFF0)>>4;

#7


引用 6 楼 jointan 的回复:
他的Struct是要取UINT32的位的,StructLayout肯定不行,因为它只能控制到字节,

就放一个UINT32进去就可以了,

取值时_pad的值等于(u32value & 0xFFFFFFF0)>>4;

那就将用到的类用C++或者IL来写,再编译到一起。

#8


引用 7 楼 caozhy 的回复:
引用 6 楼 jointan 的回复:
他的Struct是要取UINT32的位的,StructLayout肯定不行,因为它只能控制到字节,

就放一个UINT32进去就可以了,

取值时_pad的值等于(u32value & 0xFFFFFFF0)>>4;

那就将用到的类用C++或者IL来写,再编译到一起。



我的类是用C++ 写好的,怎么将它们编译到一起,要是能直接用C++, 就太好了~不用移植了。

#9


网上查了下,是将c++做成一个dll,但是,我这边全是类。。不行~

#1


[StructLayout(LayoutKind.Explicit)]
class A
{
    [FieldOffset(0)]
    public uint u32Value;

    [FieldOffset(0)]
    public MyStruct something;
}

#2


这个东西只能用掩码的&运算进行取值了,直接传个UINT32就行了

#3


楼上的貌似正确。。。学习了

#4


引用 3 楼 baesky 的回复:
楼上的貌似正确。。。学习了

如果都是值类型的话或许可以,否则可能编译通不过,而且
  [System.Runtime.InteropServices.FieldOffset(0)]
  public double d;

  [System.Runtime.InteropServices.FieldOffset(0)]
  public float f1;
  [System.Runtime.InteropServices.FieldOffset(32)]
  public float f2;
类似这样的话,f2似乎不能正确赋值(以前试过好像是这样)
参见: 如何实现类似于c语言中的共用体

#5


引用 1 楼 gomoku 的回复:
[StructLayout(LayoutKind.Explicit)]
class A
{
  [FieldOffset(0)]
  public uint u32Value;

  [FieldOffset(0)]
  public MyStruct something;
}


正解。

#6


他的Struct是要取UINT32的位的,StructLayout肯定不行,因为它只能控制到字节,

就放一个UINT32进去就可以了,

取值时_pad的值等于(u32value & 0xFFFFFFF0)>>4;

#7


引用 6 楼 jointan 的回复:
他的Struct是要取UINT32的位的,StructLayout肯定不行,因为它只能控制到字节,

就放一个UINT32进去就可以了,

取值时_pad的值等于(u32value & 0xFFFFFFF0)>>4;

那就将用到的类用C++或者IL来写,再编译到一起。

#8


引用 7 楼 caozhy 的回复:
引用 6 楼 jointan 的回复:
他的Struct是要取UINT32的位的,StructLayout肯定不行,因为它只能控制到字节,

就放一个UINT32进去就可以了,

取值时_pad的值等于(u32value & 0xFFFFFFF0)>>4;

那就将用到的类用C++或者IL来写,再编译到一起。



我的类是用C++ 写好的,怎么将它们编译到一起,要是能直接用C++, 就太好了~不用移植了。

#9


网上查了下,是将c++做成一个dll,但是,我这边全是类。。不行~