2017-02-07 1 views
0

나는 완전히 새로운 것에 대한 비트 마스킹과 관련하여 질문이 있습니다. 응용 프로그램에는 현재 주소의 바이트 []를 취하고 truefalse 인 경보 (bool)를 결정하는 수단이 있습니다.C#에서 비트 마스킹, 열거 형에서 바이트 []로 변환

나는 이것을 뒤집어보고 싶습니다. 나는 속성 목록 (부울)을 가지며 어떤 것이 사실인지에 따라 주소를 만들 것입니다.

간편한 내장 방법이 있나요?

도움을 주시면 감사하겠습니다. 아래에서는 주소에서 어떤 플래그가 활성화되어 있는지 얻기 위해 코드를 첨부했습니다.

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 세트를 함께 열거 형 배열로 변환하려고하는 것처럼 들릴 수 있습니다. 다음과 같이, 수학의 비트와 함께 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 
} 
관련 문제