Bitfield在C#结构中行为不端

时间:2016-05-02 17:34:33

标签: c# structure

min:6位 res1:1位 iv:1位

结构中的所有内容看起来都很棒,但我没有得到预期的结果!

    struct cp56time2a
{

    internal byte cp56time2a_data1; 


    public byte min
    {
        get { return (byte)(cp56time2a_data1 & 0x3f); }
        set { cp56time2a_data1 = (byte)((cp56time2a_data1 & ~0x3f) | (value & 0x3f)); }
    }                                           //min :6;   0..59 
    public byte res1
    {
        get        { return (byte)((cp56time2a_data1 >> 6) & 0x01); }
        set        { cp56time2a_data1 = (byte)((cp56time2a_data1 & ~(0x01 << 6)) | (value & 0x01) << 6); }
    }
    public byte iv
    {
        get        { return (byte)((cp56time2a_data1 >> 7) & 0x01); }
        set        { cp56time2a_data1 = (byte)((cp56time2a_data1 & ~(0x01 << 7)) | (value & 0x01) << 7); }
    }         
}     

我试图将此值分配给每个结构字段:0x55 = 0 1 010101

简单测试代码:

        T.min = 0x55 ;     
        Console.WriteLine("min = {0}", T.min);
        Console.WriteLine("res1 = {0}", T.res1);
        Console.WriteLine("iv = {0}", T.iv);
        Console.WriteLine("cp56time2a_data1 = {0}",T.cp56time2a_data1);

        T.res1 = 0x55 ;
        Console.WriteLine("min = {0}", T.min);
        Console.WriteLine("res1 = {0}", T.res1);
        Console.WriteLine("iv = {0}", T.iv);
        Console.WriteLine("cp56time2a_data1 = {0}", T.cp56time2a_data1);

        T.iv = 0x55 ;
        Console.WriteLine("min = {0}", T.min);
        Console.WriteLine("res1 = {0}", T.res1);
        Console.WriteLine("iv = {0}", T.iv);
        Console.WriteLine("cp56time2a_data1 = {0}", T.cp56time2a_data1);`

预计会显示:min =21 || res1 = 1 || iv = 0

但这就是我得到的:enter image description here

结构的内部字节行为不端。你的想法请!!

1 个答案:

答案 0 :(得分:1)

对于两个属性res1iv,您有:value & 0x01换句话说,您只获取分配给这些属性的值的最低位。

同样,当您阅读这些属性时,请执行以下操作:& 0x01。因此很明显,这些属性旨在读取和写入一位,即它们是01