2016-05-02 13 views
-2

分を不正な動作を1ビット IV:1ビットビットフィールドは、C#の構造に

構造体のすべてが偉大に見えますが、私は期待どおりの結果を得ることはありません!

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); } 
    }   
}  

Iは、構造の各フィールドにこの値を割り当てることを試みた:は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

構造体の内部バイトが誤動作しています。あなたの考えてください!

+0

'' bool'ではなく 'res1'と' iv'を 'byte'にする点は何ですか? Theは '1'または '0'のみを表すことができます。それらに0x55を割り当てることは誤解を招きます。 – Rotem

+2

すべての結果は正しいです。何も変なことはありません。あなたは彼らが間違っていると思う理由を説明できますか? res1に割り当てる前にres1 = 1 **と表示されるのはなぜですか?何も割り当てないので、ゼロになります!あなたが何かを割り当てるとき、0x55の低いビットは1に変わります。 –

+0

@Rotemバッファから読み込むために、何トンものバイトがあります。マスクを作成したり、関数内を移動したりしたくありません。さらに、私はいくつかの1 | 2 | 3 | 4 | 5ビットのシーケンスで構成されている同様の構造体を持っています:私は物事を複雑にしていません.. –

答えて

1

2つのプロパティres1ivの場合は、次のようになります。value & 0x01つまり、これらのプロパティに割り当てられた値の最下位ビットのみを取ります。

また、これらのプロパティを読み取るときには、& 0x01を実行します。したがって、これらのプロパティは1ビットを読み書きすることを意図していたことは明らかです。つまり、0または1です。

+0

あなたは正しいです。ありがとう、相棒 。 –

+0

res1: '値&0x40' iv: '値&0x80'。それはそれを修正するはずです。 –