2016-04-17 30 views
6

私は現在、いくつかの原始的なGoogleコードを持っています..それは動作しますが、私は列挙型にスワップしたいです。bitarrayからenumに変更

は現在、私は、私は現在、これを持って

、設定されているいくつかのビットフラグを表現するためにバイトが必要になります。このことからConvertToByteとラインで使用

BitArray bitArray =new BitArray(new bool[] { true, true, false, false, false, false, false, false }); 

..

new byte[] {ConvertToByte(bitArray)}) 

サイト...

private static byte ConvertToByte(BitArray bits) // http://stackoverflow.com/questions/560123/convert-from-bitarray-to-byte 
    { 
     if (bits.Count != 8) 
     { 
      throw new ArgumentException("incorrect number of bits"); 
     } 
     byte[] bytes = new byte[1]; 
     bits.CopyTo(bytes, 0); 
     return bytes[0]; 
    } 

は、しかし、私は私が触れたとして列挙型を使用していたので、私はそれを作成しました:

[Flags] 
public enum EventMessageTypes 
{ 
    None = 0, 
    aaa = 1, 
    bbb = 2, 
    ccc = 4, 
    ddd = 8, 
    eee = 16, 
    fff = 32, 
    All = aaa | bbb | ccc | ddd | eee | fff // All Events 
} 

、その後

 // Do bitwise OR to combine the values we want 
     EventMessageTypes eventMessages = EventMessageTypes.aaa | EventMessageTypes.bbb | EventMessageTypes.ccc; 

しかし、どのように私は、バイトにeventMessagesを得るのですか(0x07の)おもう!私はそれを私のバイト配列に追加できますか?私はあなたの問題の権利を理解していれば

答えて

2

単にバイトにキャスト!
例:

byte eventMessages =(byte)(EventMessageTypes.aaa | EventMessageTypes.bbb | EventMessageTypes.ccc); 
+0

うーん...重大\tコード\t説明\tプロジェクト\tファイル'によって列挙するint型に変換することができます\t行 エラー\t CS0019 \t演算子 '|' 'byte'型と 'EventMessageTypes'型のオペランドには適用できません –

+1

@David Wallis括弧に注意してください。もう一度やり直してください。すべての(|)オペランドを括弧に閉じ、すべてを1つのステートメントとしてbyteにキャストします。たとえば、value1だけがbyte型にキャストされているため、この文はエラー( '(byte)enum.value1 | enum.value2;まだエラーが発生した場合は、コードを挿入してください。 –

+0

@ mehrdad safa ..ありがとう! –

1

が、その後、本質的に、あなたがこのEventMessageTypes result = (EventMessageTypes)ConvertToByte(bitArray);

BitArray bitArray = new BitArray(new bool[] 
    { true, true, false, false, 
     false, false, false, false }); 
EventMessageTypes b = (EventMessageTypes)ConvertToByte(bitArray); 

のように列挙型にキャストすることができますが、読みやすさと将来のコードの再利用のために

static class Extension 
{ 
    public static byte ToByte(this BitArray bits) 
    { 
     if (bits.Count != 8) 
     { 
      throw new ArgumentException("incorrect number of bits"); 
     } 
     byte[] bytes = new byte[1]; 
     bits.CopyTo(bytes, 0); 
     return bytes[0]; 
    } 

    static class EnumConverter<TEnum> where TEnum : struct, IConvertible 
    { 
     public static readonly Func<long, TEnum> Convert = GenerateConverter(); 

     static Func<long, TEnum> GenerateConverter() 
     { 
      var parameter = Expression.Parameter(typeof(long)); 
      var dynamicMethod = Expression.Lambda<Func<long, TEnum>>(
       Expression.Convert(parameter, typeof(TEnum)), 
       parameter); 
      return dynamicMethod.Compile(); 
     } 
    } 
    public static T ToEnum<T>(this byte b) where T : struct, IConvertible 
    { 
     if (!typeof(T).IsEnum) 
     { 
      throw new ArgumentException("T must be an enumerated type"); 
     } 
     return EnumConverter<T>.Convert(b); 
    } 
} 

その後拡張クラスを作ることができますこのような変換を書くことができます。 bitArray.ToByte()またはより良いこのEventMessageTypes b = bitArray.ToByte().ToEnum<EventMessageTypes>();

+0

ビット配列を使用したくありません。列挙型とそれから値を入れ替えたいbitwiseまたは。 –

+0

それでは、どのようにデータを取得/生成しますか? bools /ビットまたはバイト –

+0

として、あなたは(列挙型)int型/ byte'や他の方法で回避 '(int型/バイト)enum' –

1

Here's one wayのような:

var bitArray = new BitArray(
    new [] { true, true, false, false, false, false, false, false }); 
var eventMessages = (EventMessageTypes)bitArray 
    .Cast<Boolean>() 
    .Reverse() 
    .Aggregate(0, (agg, b) => (agg << 1) + (b ? 1 : 0)); 

Download for LinqPad

1

あなたは今ちょうどキャスト、byteを取得する方法を持っている:

byte b = ConvertToByte(bitArray); 
EventMessageTypes a = (EventMessageTypes) b; 

また、先端部を、外の追加後に誰かを防ぐためにbyteに列挙範囲を制限します範囲の値を列挙型に変換します。

[Flags] 
public enum EventMessageTypes : byte 
{ 
    ... 
} 
+0

duh ..なぜ私はそれを考えなかったのですか?範囲を制限しようとするでしょう。後になるまで待つ必要があり、結果を投稿します。 :) –

関連する問題