从bitarray转换为enum

6

我目前有一些粗糙的谷歌代码... 能够工作,但我希望改为使用枚举。

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

我目前有以下代码:

 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) // https://dev59.com/F3RB5IYBdhLWcg3wpotm
    {
        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),以便可以将其附加到我的字节数组中呢?

4个回答

2
这是一种方法:

这里是链接

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

下载 LinqPad


2

只需要将它简单地转换为字节!
例子:

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

哦... 严重程度代码描述 项目 文件 行 错误 CS0019 运算符 '|' 不能应用于类型为 'byte' 和 'EventMessageTypes' 的操作数。 - David Wallis
1
@David Wallis 请注意括号并再试一次。将所有操作数用括号括起来,并将它们作为一个语句转换为字节。例如,这个语句可能是错误的:(byte)enum.value1|enum.value2; 因为只有value1被转换为字节。如果仍然出现错误,请插入您的代码。 - mehrdad safa
@David Wallis 我很高兴能够帮助。 - mehrdad safa

2

您已经获取了一个byte,现在只需要进行转换:

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

此外,一个提示是,限制枚举范围为byte,以防止将超出范围的值添加到枚举中。
[Flags]
public enum EventMessageTypes : byte
{
   ...
}

咦,为什么我没想到呢?试试限制范围吧。得等会儿再发结果。 :) - David Wallis

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

我不想使用位数组,我想用枚举来替换它,然后使用按位或操作来处理值。 - David Wallis
那么,你如何获取/生成数据?是作为布尔值/位或字节。 - Thomas Andreè Wang
你可以通过(enum)int/byte将int转换为枚举类型,反之亦然,可以通过(int/byte)enum将枚举类型转换为int。 - Thomas Andreè Wang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接