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;
}
class A
{
[FieldOffset(0)]
public uint u32Value;
[FieldOffset(0)]
public MyStruct something;
}
#2
这个东西只能用掩码的&运算进行取值了,直接传个UINT32就行了
#3
楼上的貌似正确。。。学习了
#4
如果都是值类型的话或许可以,否则可能编译通不过,而且
[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
正解。
#6
他的Struct是要取UINT32的位的,StructLayout肯定不行,因为它只能控制到字节,
就放一个UINT32进去就可以了,
取值时_pad的值等于(u32value & 0xFFFFFFF0)>>4;
就放一个UINT32进去就可以了,
取值时_pad的值等于(u32value & 0xFFFFFFF0)>>4;
#7
那就将用到的类用C++或者IL来写,再编译到一起。
#8
我的类是用C++ 写好的,怎么将它们编译到一起,要是能直接用C++, 就太好了~不用移植了。
#9
网上查了下,是将c++做成一个dll,但是,我这边全是类。。不行~
#1
[StructLayout(LayoutKind.Explicit)]
class A
{
[FieldOffset(0)]
public uint u32Value;
[FieldOffset(0)]
public MyStruct something;
}
class A
{
[FieldOffset(0)]
public uint u32Value;
[FieldOffset(0)]
public MyStruct something;
}
#2
这个东西只能用掩码的&运算进行取值了,直接传个UINT32就行了
#3
楼上的貌似正确。。。学习了
#4
如果都是值类型的话或许可以,否则可能编译通不过,而且
[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
正解。
#6
他的Struct是要取UINT32的位的,StructLayout肯定不行,因为它只能控制到字节,
就放一个UINT32进去就可以了,
取值时_pad的值等于(u32value & 0xFFFFFFF0)>>4;
就放一个UINT32进去就可以了,
取值时_pad的值等于(u32value & 0xFFFFFFF0)>>4;
#7
那就将用到的类用C++或者IL来写,再编译到一起。
#8
我的类是用C++ 写好的,怎么将它们编译到一起,要是能直接用C++, 就太好了~不用移植了。
#9
网上查了下,是将c++做成一个dll,但是,我这边全是类。。不行~