【问题标题】:Change from bitarray to enum从位数组更改为枚举
【发布时间】:2016-08-09 01:22:30
【问题描述】:

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

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

我目前有这个:

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

但是我想在我提到的时候使用一个枚举,所以我这样创建它:

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

【问题讨论】:

    标签: c# enums flags


    【解决方案1】:

    你有办法获得byte,所以现在只需投射:

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

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

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

    【讨论】:

    • duh.. 为什么我没有想到这一点.. 也会尝试限制范围.. 必须等到稍后再发布结果。 :)
    【解决方案2】:

    只需简单地将其转换为字节!。
    示例:

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

    【讨论】:

    • Hmm... 严重性代码 描述 项目文件行错误 CS0019 运算符 '|'不能应用于“byte”和“EventMessageTypes”类型的操作数
    • @David Wallis 请注意括号并重试。将所有 (|) 操作数关闭到括号,并将所有操作数转换为字节作为一个语句。例如,这个语句可能是一个错误:(byte)enum.value1|enum.value2; 因为只是 value1 转换为字节。如果仍然出现错误,请插入您的代码。
    • @David Wallis 很高兴能帮上忙。
    【解决方案3】:

    如果我理解你的问题,那么本质上你可以像这样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&lt;EventMessageTypes&gt;();

    【讨论】:

    • 我不想使用位数组, - 这就是我想要交换枚举,然后是按位或的值。
    • 那么,您如何获取/生成数据?作为布尔值/位或字节
    • 您可以通过 (enum)int/byte 将 int 转换为 enum,反之亦然 (int/byte)enum
    【解决方案4】:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      相关资源
      最近更新 更多