如何将位掩码值转换为选项对象



我必须读/写一个XML文件,该文件将其数据存储为位掩码值。

例如

<panel>
    <options arming="21" opt_b="51" opt_c="6" />
</panel>

在这种情况下,arming的值为21,但它对应于以下字节串:

10101

这些字节对应于以下列表中的选项0,2,4:

  • 位0:强制臂
  • Bit 1:最终门
  • 位2:退出故障
  • Bit 3:禁止篡改
  • 位4:显示
  • Bit 8:重新排列
  • Bit 9:线路
  • Bit 10:扩展块

对我来说去最好的方法是什么

  • 将其从21的十进制值转换为表示选项的对象模型
  • 使用该对象将这些显示为供用户选择和取消选择的选项

这样声明枚举:

[Flags]
public enum ArmingFlags {
   None=0
   Forced_arm = 1
   Final_door = 2
   Exit_fault = 4
   Inhibit_tamper = 8
   Display = 16
   Rearm = 32
   Line = 64
   Extend_block = 128
}

注意我在枚举中使用的二次幂。这些允许枚举使用二进制位位置来表示离散值(请参阅为什么枚举权限通常有0、1、2、4个值?)

然后将您的值解析为一个整数,并将其转换为ArmingFlags类型(注意,未经测试的代码在前面,但应该有效):

ArmingFlags flagsVal = ArmingFlags.None;
Int32 val;
if (Int32.TryParse(armingString, out val)) {
    flagsVal = (ArmingFlags)val;
}
// Then you can test it for expected values:
if ((flagsVal & ArmingFlags.Rearm) == ArmingFlags.Rearm) {
    //The Rearm bit was set...
}

有很多关于如何在WPF组合框或单选按钮中使用枚举的帖子,例如:

将枚举属性数据绑定到WPF 中的组合框

如何使用枚举的功能来帮助您:

[Flags]
public enum AlarmData
{
    ForcedArm = 1,
    FinalDoor = 2,
    ExitFault = 4,
    InhibitTamper = 8,
    Display = 16,
    Rearm = 32,
    Line = 64,
    ExtendBlock = 128
}
private static Dictionary<AlarmData, string> alarmDataLookup = new Dictionary<AlarmData, string>
{
    { AlarmData.ForcedArm, "Forced arm" },
    { AlarmData.FinalDoor, "Final door" },
    { AlarmData.ExitFault, "Exit fault" },
    { AlarmData.InhibitTamper , "Inhibit tamper" },
    { AlarmData.Display , "Display" },
    { AlarmData.Rearm , "Rearm" },
    { AlarmData.Line , "Line" },
    { AlarmData.ExtendBlock , "Extend block" }
};
public IEnumerable<string> EnumerateValues(AlarmData data)
{
    return from pair in alarmDataLookup 
            where data.HasFlag(pair.Key) 
            select pair.Value;
}

从XML中读取值后,调用EnumerateValues很简单,只需将整数强制转换为AlarmData枚举即可,例如:

int value = GetAlarmValueFromXml();
var bindableValues = EnumerateValues((AlarmData)value);

当然,您不必从EnumerateValues方法返回字符串。然后,您所需要做的就是将方法的结果绑定到列表或其他元素,Bob就是您的叔叔。

最新更新