如何将枚举值转换为压缩字符串?

时间:2012-02-13 14:48:24

标签: c# enums compression

我有一个定义如下的枚举:

[Flags]
public enum MyEnum
{
    None = 0,

    ValueOne                = 1 << 0,
    ValueTwo                = 1 << 1,
    ValueThree              = 1 << 2,
    ValueFour               = 1 << 3,
    ...
    ValueTwoEightyOne           = 1 << 280,
}

我希望能够将使用率转换为可能的最短字符串,类似于:

var compressedString = ConvertToCompressedString(MyEnum.ValueOne | MyEnum.ValueThree | MyEnum.ValueFour);

然后在程序的不同部分,我想将compressedString转换回枚举

var enumValue = ConvertBack(compressedString);

使用如此多的值转换枚举的有效方法是什么?如果有更好的方法来处理这种用例,我很感兴趣。

2 个答案:

答案 0 :(得分:2)

enum值由内存中的整数字段支持。那么你需要的压缩比整数本身还要多吗?

MyEnum value = MyEnum.ValueOne | MyEnum.ValueThree | MyEnum.ValueFour;
int i = (int)value;
// transport i

但要小心,因为1&lt;&lt; 280(2 ^ 280)是一个非常大的数字,无法存储在Int32甚至Int64中。

答案 1 :(得分:1)

如果我需要一个带有超过64个标志的“Flags enum”,我可能只使用一个enum作为位索引,然后将BitArray包装在一个类中以保存这些值。

要获得紧凑表示,可以将位数组转换为字节数组。我从代码中省略了该步骤,但您可以执行以下操作: like this(注意字节序!)

public class LargeFlagsEnum<T> where T : struct
{
   private BitArray bits;

   public LargeFlagsEnum(int numBits)
   {
      if (!(typeof(T).IsEnum))
        throw new ArgumentException("Expected enum type");
      bits = new BitArray(numBits);
   }

   public byte[] GetBytes()
   {
      return bits.ConvertToByteArray();
   }

   public void Set(T flag, bool value)
   {
      bits[Convert.ToInt32(flag)] = value;
   }

   public bool Get(T flag)
   {
      return bits[Convert.ToInt32(flag)];
   }    
}

// Example:

enum MyFlags
{
   First = 1,
   SomethingElse = 280,    
}

class Example
{
   void Main()
   {
      var someFlags = new LargeFlagsEnum<MyFlags>(281);
      someFlags.Set(MyFlags.SomethingElse, true);
      Transmit(someFlags.GetBytes()); 
   }
}