2016-04-17 19 views
6

Şu anda biraz ham google kodum var .. bu işe yarıyor ama ben bir takas takas etmek istiyorum.bitarray ile enum arasında değiştirin

Şu anda Şu anda bu var

, ayarlanan bazı bit bayrakları temsil etmek üzere bir bayt gerekir: bundan ConvertToByte doğrultusunda kullanılan

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

..

new byte[] {ConvertToByte(bitArray)}) 

site ...

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]; 
    } 
Ben değindiğimiz olarak

Ancak bir enum kullanmak istedi, bu yüzden şekilde oluşturulduğu:

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

ve sonra

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

Ama sonra bir bayt eventMessages nasıl elde edersiniz (0x07) Bence! bunu bayt dizime ekleyebilir miyim? Ben senin sorunun hakkına anlamak

cevap

2

Sadece basitçe bayt için döküm !.
örnek: şimdi sadece dökme Bir byte almanın bir yolu var

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

Hmm ... Önem \t Kod \t Açıklama \t Proje \t Dosya' tarafından enum int dönüştürmek \t Satır Hata \t CS0019 \t Operatör '|' 'byte' ve 'EventMessageTypes' –

+1

@David Wallis türlerine işlenemez, lütfen paranteze dikkat edin ve tekrar deneyin.tüm (|) işlenenleri paranteze kapatın ve tüm ifadeleri tek bir ifade olarak atayın. Örneğin, bu ifade bir hata olabilir: '(byte) enum.value1 | enum.value2; çünkü yalnızca değer1 bayt olarak yayınlanır. Hala hata alıyorsanız kodunuzu ekleyin. –

+0

@ mehrdad safa .. thankyou! –

1

ardından özünde bu EventMessageTypes result = (EventMessageTypes)ConvertToByte(bitArray);

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

gibi enum yayınlayabileceğim size okunabilirliği ve gelecekteki kod yeniden kullanımı için

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

Sonra uzatma sınıf yapabiliriz sen dönüşümü böyle yazabilir. bitArray.ToByte() veya daha iyi bu EventMessageTypes b = bitArray.ToByte().ToEnum<EventMessageTypes>();

+0

Bit dizisini kullanmak istemiyorum - enum için değiştirmeyi ve sonra değerleri bitwise veya ile. –

+0

Peki o zaman, verileri nasıl alıyorsunuz/üretiyorsunuz? bool değerlerden oluşan/bit veya bayt –

+0

gibi (enum) int/byte' ve çevresindeki diğer yolu '(int/bayt) enum' –

1

Here's one way gibi:

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 b = ConvertToByte(bitArray); 
EventMessageTypes a = (EventMessageTypes) b; 

Ayrıca, bir ipucu, birisi sonradan dışarı ekleyerek önlemek için byte için enum aralığını kısıtlamak aralık değerleri enum değerine:

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

duh .. neden bunu düşünmedim .. aralığını da kısıtlamaya çalışacağım .. Daha sonra beklemek zorunda kalacak ve sonuç gönderecek. :) –