qt到c#是什么:运算符在struct中的含义

时间:2011-03-14 21:14:21

标签: c# c++ c bit-fields

我有一段代码,我正试图从旧的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;
}

4 个答案:

答案 0 :(得分:2)

这就是所谓的BitFields。 sBcdWord部分是一个32位字,每个字段是该字的一部分,分别为8,2,18,3,1 BIT : 单词布局如下:

  • Bit0-Bit7 m_0
  • Bit8-Bit9 m_S
  • Bit10-Bit27 m_D
  • Bit28-Bit30 m_ss
  • Bit31 m_P

如何在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;}}
}