【问题标题】:Converting string to flags enum in C#在 C# 中将字符串转换为标志枚举
【发布时间】:2011-07-08 13:25:06
【问题描述】:

设备将其限位开关的状态报告为一系列 1 和 0(表示包含“010111110000”的字符串)。这些开关的理想表示是这样的标志枚举:

[Flags]
public enum SwitchStatus
{
    xMin,
    xMax,
    yMin,
    yMax,

    aMax,
    bMax,
    cMax,
    unknown4,

    unknown3,
    unknown2,
    unknown1,
    unknown0
}

是否可以将字符串表示形式转换为枚举?如果有,怎么做?

【问题讨论】:

    标签: c# string enum-flags


    【解决方案1】:

    您可以使用Convert.ToInt64(value, 2)Convert.ToInt32(value, 2) 这将为您提供long 或int,然后只需使用

    [Flags]
    public enum SwitchStatus : int // or long
    {
        xMin = 1,
        xMax = 1<<1,
        yMin = 1<<2,
        yMax = 1<<3,
        ...
    }
    
    SwitchStatus status = (SwitchStatus)Convert.ToInt32(value, 2);
    

    【讨论】:

      【解决方案2】:

      首先,您必须将“二进制字符串”转换为 int。

      String binString = "010111110000";
      int number = Integer.parseInt(binString, 2);
      

      你必须用它们各自的数字声明你的枚举项目:

      [Flags]
      public enum SwitchStatus
      {
          xMin = 1,
          xMax = 2,
          yMin = 4,
          //...
          unknown0 = 32 //or some other power of 2
      }
      

      最后是映射。你从这样的数字中得到你的枚举:

      SwitchStatus stat = (SwitchStatus)Enum.ToObject(typeof(SwitchStatus), number);
      

      【讨论】:

      • 标志值将是来自二进制字符串的任何值
      • 但是 1 和 0 的字符串是所有的开关。 12 位数字,12 个枚举名称。每个枚举值应该是单个位的值。 0x0010x800
      • SwitchStatus 标志将无法正常工作,因为您拥有它们连续编号 - 您也可以删除 '[Flags] 属性。由于答案的有用性,我仍然给 +1。
      • 另外,你不能使用 base 作为变量名。已保留。
      • 叹息...我猜现在人们想要完全可编译的代码...这是一个问答网站,不是我的生产环境。人们应该通过最终的伪代码修复找到自己的方式。总之,修好了。为此被否决只是意味着......
      猜你喜欢
      • 2010-09-06
      • 2015-06-10
      • 2017-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-23
      • 2010-10-03
      相关资源
      最近更新 更多