分を不正な動作を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
構造体の内部バイトが誤動作しています。あなたの考えてください!
'' bool'ではなく 'res1'と' iv'を 'byte'にする点は何ですか? Theは '1'または '0'のみを表すことができます。それらに0x55を割り当てることは誤解を招きます。 – Rotem
すべての結果は正しいです。何も変なことはありません。あなたは彼らが間違っていると思う理由を説明できますか? res1に割り当てる前にres1 = 1 **と表示されるのはなぜですか?何も割り当てないので、ゼロになります!あなたが何かを割り当てるとき、0x55の低いビットは1に変わります。 –
@Rotemバッファから読み込むために、何トンものバイトがあります。マスクを作成したり、関数内を移動したりしたくありません。さらに、私はいくつかの1 | 2 | 3 | 4 | 5ビットのシーケンスで構成されている同様の構造体を持っています:私は物事を複雑にしていません.. –