2016-04-17 26 views
6

Attualmente ho un codice google approssimativo .. che funziona ma voglio passare a un enum.Cambio da bitarray a enum

Attualmente ho bisogno di un byte per rappresentare alcuni flag di bit che vengono impostati,

Al momento ho questo:

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

utilizzato in linea ..

new byte[] {ConvertToByte(bitArray)}) 

con ConvertToByte da questo sito ...

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

Tuttavia ho voluto usare un enum come ho toccato, così ho creato come così:

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

e poi

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

Ma come faccio poi arrivare eventMessages a un byte (0x07) Credo! quindi posso aggiungerlo al mio array di byte?

risposta

2

semplicemente gettato a BYTE !.
esempio:

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

Hmm ... Severity \t Codice \t Descrizione \t Progetto \t File \t Riga Errore \t CS0019 \t Operatore '|' non può essere applicato agli operandi di tipo "byte" e "EventMessageTypes" –

+1

@David Wallis prestare attenzione alla parentesi per favore e riprovare.chiudi tutti gli operandi (|) a parentesi e lancia tutto a byte come un'istruzione. per esempio questa affermazione potrebbe essere un errore: '(byte) enum.value1 | enum.value2;' perché solo valore1 castato in byte. inserisci il tuo codice se continua a ricevere un errore. –

+0

@ mehrdad safa .. grazie! –

1

Se ho ben capito il problema a destra, poi in sostanza si può lanciare a enum come questo EventMessageTypes result = (EventMessageTypes)ConvertToByte(bitArray);

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

si poteva per migliorare la leggibilità e il codice di riutilizzo futuro fare una classe estensione

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

Poi si puoi scrivere il convertito in questo modo. bitArray.ToByte() o meglio ancora come questo EventMessageTypes b = bitArray.ToByte().ToEnum<EventMessageTypes>();

+0

non voglio utilizzare la matrice di bit, - che è quello che voglio scambiare per l'enumerazione e poi i valori con il bit a bit o. –

+0

bene allora, come ottieni/generi i dati? come Caccio/bit o byte –

+0

è possibile convertire int enum da '(enum) int/byte' e viceversa' (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

Hai un modo di ottenere un byte, così ora basta lanciare:

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

Inoltre, una punta, restringere il campo enum per byte per evitare che qualcuno in seguito l'aggiunta di valori di intervallo per l'enumerazione:

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

duh .. perchè non ci ho pensato ... proveremo a limitare anche la gamma .. Dovremo aspettare fino a tardi e pubblicheremo i risultati. :) –