我有一段代码,我正试图从旧的qt文件转换为C#,但我有点不清楚下面的union中的struct中发生了什么。我不确定':'是什么...我猜它设置的大小但是找不到任何关于此的文档。此外,由于C#没有工会,转换这样的东西的最佳做法是什么。谢谢
union uAWord
{
uAWord()
: m_AWord(0) {}
struct sBcdAWord
{
quint32 m_O :8;
quint32 m_S :2;
quint32 m_D :18;
quint32 m_SS :3;
quint32 m_P :1;
}
sBcdAWord m_F;
quint32 m_AWord;
}
答案 0 :(得分:2)
这就是所谓的BitFields。 sBcdWord部分是一个32位字,每个字段是该字的一部分,分别为8,2,18,3,1 BIT : 单词布局如下:
如何在C#中移植它取决于您是否正在移植代码,或者如果您需要PInvoke。在PInvoke的情况下,最好的解决方案可能是将sBcdAWord映射为Unit32,并创建一些访问策略来掩盖读写。如果它是一个代码端口,使用separeted属性将是好的,除非在内存使用节省中有特殊需要。
答案 1 :(得分:1)
该语法用于声明位域。该数字是该值的位数。请参阅示例http://publib.boulder.ibm.com/infocenter/macxhelp/v6v81/index.jsp?topic=%2Fcom.ibm.vacpp6m.doc%2Flanguage%2Fref%2Fclrc03defbitf.htm
对C#的良好转换取决于我猜的情况。只要你不太注重空间,我就会在课堂上并行保留所有需要的值。
答案 2 :(得分:0)
将m_aWord
初始化为0
。
答案 3 :(得分:0)
要回答你的另一个问题,在C#中你可能想要一个结构,你需要使用属性来获得类似联合的行为。
这个特例可能有点像:
[StructLayout(LayoutKind.Explicit)]
struct uAWord {
[FieldOffset(0)]
private uint theWord = 0;
[FieldOffset(0)]
public int m_P;
[FieldOffset(1)]
public int m_S;
[FieldOffset(3)]
public int m_SS;
[FieldOffset(7)]
public int m_O;
[FieldOffset(18)]
public int m_D;
public uAWord(uint theWord){
this.theWord = theWord;
}
}
LayoutKind.Explicit
表示您将告诉它在内存中映射每个字段的位置,FieldOffset(int)
告诉哪个位开始每个字段。 See this for more details.您可以通过在构造函数中设置uint theWord
来分配此结构,然后每个其他属性将访问从不同内存地址开始的块。
不幸的是,这实际上是不正确的。你需要使用属性并做一些bitmasking / shift来使它正确。像这样:
struct uAWord {
private uint theWord = 0;
public int m_P {get {return (theWord & 0x01);}}
public int m_S {get {return (theWord & 0x02) << 2;}}
public int m_SS {get {return (theWord & 0x04) << 3;}}
public int m_0 {get {return (theWord & 0x18) << 6;}}
}