从位数组更改为枚举

Change from bitarray to enum

我目前有一些粗略的 google 代码..可以工作,但我想换成一个枚举。

目前我需要一个字节来表示一些设置的位标志,

我目前有这个:

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

在线使用..

new byte[] {ConvertToByte(bitArray)})

使用此站点的 ConvertToByte...

    private static byte ConvertToByte(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];
    }

但是我想使用枚举,所以我创建了它:

[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)!这样我就可以将它附加到我的字节数组中了吗?

如果我对你的问题理解正确,那么本质上你可以像这样转换为枚举 EventMessageTypes result = (EventMessageTypes)ConvertToByte(bitArray);

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

为了可读性和将来的代码重用,您可以进行扩展 class

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

然后你可以这样写convert。 bitArray.ToByte() 甚至更好 EventMessageTypes b = bitArray.ToByte().ToEnum<EventMessageTypes>();

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

只需将其转换为字节即可!
示例:

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

你有办法获得 byte,所以现在只需施放:

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

此外,提示,将枚举范围限制为 byte 以防止有人稍后将超出范围的值添加到枚举中:

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