2016-04-17 4 views
6

Ich habe derzeit einige grobe Google-Code .. das funktioniert, aber ich möchte zu einem Enum tauschen.Wechsel von Bitarray zu Enum

Zur Zeit muss ich ein Byte einige Bitflags darzustellen, die gesetzt sind,

ich zur Zeit dieses:

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

in Zeile verwendet ..

new byte[] {ConvertToByte(bitArray)}) 

mit ConvertToByte von diesem Standort ...

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

Allerdings wollte ich eine Enumeration verwenden, wie ich berühren, so Ich habe es als so:

[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 
} 

und dann

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

Aber wie kann ich dann eventMessages auf ein Byte erhalten (0x07) Ich denke! also kann ich das an mein Byte-Array anhängen?

Antwort

2

nur einfach werfen es auf Byte !.
Beispiel:

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

Hmm ... Severity \t-Code \t Beschreibung \t Projekt \t Datei konvertieren \t Zeile Fehler \t CS0019 \t Operator '|' kann nicht auf Operanden vom Typ 'Byte' und 'EventMessageTypes' angewendet werden –

+1

@David Wallis bitte achten Sie auf Klammern bitte und versuchen Sie es erneut.schließe alle (|) Operanden in Klammern und wirf alle auf Byte als eine Anweisung. Zum Beispiel könnte diese Anweisung ein Fehler sein: '(Byte) enum.value1 | enum.value2;' weil nur Wert1 in Byte umgewandelt wird. Fügen Sie Ihren Code ein, wenn der Fehler weiterhin auftritt. –

+0

@ mehrdad safa .. danke! –

1

Wenn ich dein Problem richtig verstehe, dann im Grunde können Sie diese wie Enum gieße EventMessageTypes result = (EventMessageTypes)ConvertToByte(bitArray);

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

könnten Sie für die Lesbarkeit und zukünftige Wiederverwendung von Code eine Erweiterungsklasse machen

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

Dann sind Sie kann die Konvertierung so schreiben. bitArray.ToByte() oder besser noch wie diese EventMessageTypes b = bitArray.ToByte().ToEnum<EventMessageTypes>();

+0

Ich möchte nicht die Bit-Array verwenden - das ist, was ich für die enum und dann die Werte tauschen will mit dem bitweisen oder. –

+0

Na dann, wie bekommt man die Daten? als bools/Bits oder Bytes –

+0

können Sie int ENUM von '(ENUM) int/byte' und umgekehrt' (int/Byte) 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

Sie haben eine Möglichkeit, ein byte zu bekommen, so dass jetzt nur Stimmen:

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

Auch eine Spitze, beschränkt den ENUM Bereich byte jemand später zu verhindern Zugabe von Bereichswerte für die Enumeration:

+0

duh .. warum habe ich nicht daran gedacht .. werde versuchen, die Reichweite zu beschränken .. muss bis später warten und wird Ergebnisse posten. :) –