从bitarray改为enum

时间:2016-04-17 09:24:11

标签: c# enums flags

我目前有一些粗略的谷歌代码..但有效,但我想换成枚举。

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

我目前有这个:

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

来自此网站的ConvertToByte ......

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

然后

{{1}}

但是我怎么把eventMessages变成一个字节(0x07)我想!所以我可以将它附加到我的字节数组中?

4 个答案:

答案 0 :(得分:2)

只需将其转换为字节! 例如:

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

答案 1 :(得分:2)

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

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

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

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

答案 2 :(得分: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>();

答案 3 :(得分: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