2017-02-07 38 views
0

我有一個關於位掩碼的問題,我完全不知道。 在應用程序中,目前有采取地址字節[]的方法,並從中確定哪些警報(布爾型)是truefalseC#中的位掩碼,從枚舉轉換爲字節[]

我期待扭轉這一點。我會有一個屬性列表(布爾),並基於哪些是真實的,我會創建一個地址。

是否有一個簡單的內置方法來做到這一點?

任何幫助將不勝感激。下面我附上了我的代碼,以獲取地址中啓用了哪些標誌。

public struct DeviceStatus 
{ 
    [Flags] 
    public enum DeviceStatusMasks 
    { 
     None = 0x0, 
     EmergencyButton = 0x00000001, 
     StartButton = 0x02, 
     Door1Interlock = 0x04, 
     Door2Interlock = 0x08, 
     AccessPanelInterlock = 0x10, 
     TubeTemperature = 0x20, 
     SystemTemperature = 0x40, 
     DeviceTouchScreenError = 0x80, 
     FlashValueCorrupt = 0x100, 
     VoltageRailError3_3V = 0x200, 
     VoltageRailError5V = 0x400, 
     VoltageRailError24V = 0x800, 
     HvPsuWarmUpTimerElapsed = 0x1000, 
     // ReSharper disable InconsistentNaming 
     kVValueOutsideRange = 0x2000, 
     mAValueOutsideRange = 0x4000, 
     // ReSharper restore InconsistentNaming 
     PreheatValueError = 0x8000, 
     FilamentCurrentError = 0x10000, 
     KeySwitchOff = 0x00020000, 
     StandbyButtonPressed = 0x40000, 
     ErrorTrapState = 0x80000, 
     PcCommunicationFailure = 0x100000 
    } 


    public DeviceStatus(byte[] value) 
    { 
     RawValue = (DeviceStatusMasks)BitConverter.ToInt32(value.Reverse().ToArray(), 0); 
    } 

    #region Public Properties 

    public bool CriticalError => EmergencyButtonPressed | TubeTemperatureHigh | SystemTemperatureHigh; 

    public bool EmergencyButtonPressed => RawValue.HasFlag(DeviceStatusMasks.EmergencyButton); 

    public bool StartButtonPressed => RawValue.HasFlag(DeviceStatusMasks.StartButton); 

    public bool Door1InterlockOpen => RawValue.HasFlag(DeviceStatusMasks.Door1Interlock); 

    public bool Door2InterlockOpen => RawValue.HasFlag(DeviceStatusMasks.Door2Interlock); 

    public bool AccessPanelInterlockOpen => RawValue.HasFlag(DeviceStatusMasks.AccessPanelInterlock); 

    public bool TubeTemperatureHigh => RawValue.HasFlag(DeviceStatusMasks.TubeTemperature); 

    public bool SystemTemperatureHigh => RawValue.HasFlag(DeviceStatusMasks.SystemTemperature); 

    public bool DeviceTouchScreenError => RawValue.HasFlag(DeviceStatusMasks.DeviceTouchScreenError); 

    public bool FlashValueCorrupt => RawValue.HasFlag(DeviceStatusMasks.FlashValueCorrupt); 

    public bool VoltageRailError3_3V => RawValue.HasFlag(DeviceStatusMasks.VoltageRailError3_3V); 

    public bool VoltageRailError5V => RawValue.HasFlag(DeviceStatusMasks.VoltageRailError5V); 

    public bool VoltageRailError24V => RawValue.HasFlag(DeviceStatusMasks.VoltageRailError24V); 

    public bool HvPsuWarmUpTimerElapsed => RawValue.HasFlag(DeviceStatusMasks.HvPsuWarmUpTimerElapsed); 

    // ReSharper disable InconsistentNaming 
    public bool kVValueOutsideRange => RawValue.HasFlag(DeviceStatusMasks.kVValueOutsideRange); 

    public bool mAValueOutsideRange => RawValue.HasFlag(DeviceStatusMasks.mAValueOutsideRange); 

    // ReSharper restore InconsistentNaming 

    public bool PreheatValueError => RawValue.HasFlag(DeviceStatusMasks.PreheatValueError); 

    public bool FilamentCurrentError => RawValue.HasFlag(DeviceStatusMasks.FilamentCurrentError); 

    public bool KeySwitchOff => RawValue.HasFlag(DeviceStatusMasks.KeySwitchOff); 

    public bool StandbyButtonPressed => RawValue.HasFlag(DeviceStatusMasks.StandbyButtonPressed); 

    public bool ErrorTrapState => RawValue.HasFlag(DeviceStatusMasks.ErrorTrapState); 

    public bool PcCommunicationFailure => RawValue.HasFlag(DeviceStatusMasks.PcCommunicationFailure); 

    public bool HasNoStatus 
    { 
     get 
     { 
      return !(StandbyButtonPressed | Door1InterlockOpen | Door2InterlockOpen | AccessPanelInterlockOpen | KeySwitchOff | CriticalError); 
     } 
    } 
    #endregion 

    public DeviceStatusMasks RawValue { get; } 
+0

您需要查看邏輯和單個符號。 –

+0

好的,謝謝本 –

回答

0

這聽起來像是試圖將OR-ed一起的位標誌集合轉換回枚舉數組。您可以使用BitArray類以及一些數學運算,如下所示:

void Main() 
{ 
    var value = Sample.A | Sample.B; 
    var bits = new BitArray(new[] { (int)value }); 

    var enumValues = Enumerable.Range(0, bits.Length).Select(n => 
     ((Sample)(bits[n] ? Math.Pow(2, n) : 0))); 
} 

enum Sample 
{ 
    A = 0x1, 
    B = 0x2, 
    C = 0x4 
}