我正在从医疗设备中提取字节流,并且遇到了一个非常烦人的数据结构。基本上,我得到了一个 2 字节的块,其中每个位代表一个布尔值。这种结构在字节流中出现得足够频繁,可以围绕它开发一个结构/类,但在每种情况下,这些位意味着完全不同的东西。
所以首先我设置了一堆枚举来表示位结构可能具有的所有不同定义。(请注意,并非每个定义都使用每个位。有时重要位之间会出现中断。)
编辑:删除了所有看起来像“标志”的名称。我没有使用 [Flags] 属性,这似乎是一个争论点/混淆点。枚举值只是映射到我的 BitArray 中的索引。
public enum RecordInfo { AM_TEST = 0, PM_TEST, TEST_VALIDITY };
public enum RecordAlerts { ALERT1 = 0, ALERT2, ALERT3, ALERT4, VALIDATED = 15 };
然后创建这个容器来保存实际的位:
public struct TwoBytes<TEnum> where TEnum : struct, IConvertible
{
private BitArray _bits = new BitArray(2);
}
这似乎可以按我的需要工作,直到我想根据枚举名称索引我的结构。假设我有一个名为 Alerts 的 TwoByte 结构,它包含一些位值。如果我想获得这样的特定标志:
bool alert3Set = Alerts[RecordAlerts.ALERT3]
我最终得到了一个真正令人发指的索引函数。这就是我现在所拥有的:
public bool this[TEnum name]
{
get
{
int index = Enum.GetValues(typeof(TEnum)).Cast<TEnum>().ToList().Where(x => x.Equals(name)).Cast<int>().First();
return _bits[index];
}
}
现在它起作用了,够疯狂的。但是 LINQ 链看起来确实很糟糕,并且需要一段时间才能破译它实际上在做什么。
是否有一种更简洁、更有效的方式将通用枚举“名称”转换为其整数值?或者我是否更适合使用字典(或其他对象)来表示位结构定义?