WindowsCE5.0で動作するアプリをVC#を使って開発しています。
このアプリで、ICタグにデータを書き込むのですが、書き込むデータを変数に格納する際に
どうしてもビットフィールドを使いたいのです。
いろいろ調べていたら、C#ではビットフィールドが使えないようなことが書いて
あったのですが、なにか代替する方法はありますでしょうか。
要は、やりたいことは、1バイトのデータを5ビット+3ビットのように分割して扱いたいのです。
C#ではできない場合、VBではできますでしょうか?その場合はどのようにすればVBで
ビットフィールドが使えるのでしょうか?
よろしくお願いいたします。
論理演算子を使って手計算で分割/結合すればよいと思います。大して難しいということもありません。
dataがバイトデータだとすると、
上位5ビットは hi = (data >> 3) & 0x1F
下位3ビットは lo = (data & 0x07)
で得られます。
結合する場合は、
data = (hi << 3) | lo
です。
より厳密にしたければ
data = ((hi & 0x1F) << 3) | (lo & 0x07)
Flags属性を利用しましょう。
下記のような形で利用できます。
class Program
{
[System.Flags]
enum BitField : byte
{
Empty = 0,
LF1 = 1,
LF2 = 2,
LF3 = 4,
LF4 = 8,
LF5 = 16,
LFMAX = 31,
HF1 = 32,
HF2 = 64,
HF3 = 128,
HFMAX = 224,
}
static void Main(string[] args)
{// LF1とHF2以外のフラグを立てたfieldを作成
BitField field = ~BitField.LF1 & ~BitField.HF2;
if (BitField.LF2.Equals(field & BitField.LF2))
{// LF2フラグが立つ場合、fieldに含まれるLFフラグを表示
System.Console.WriteLine(field & BitField.LFMAX);
}
}
}
コメント(0件)