Powershell中的位掩码转换

时间:2015-08-13 16:10:18

标签: powershell bitmask

我正在使用代表错误代码的位掩码。例如,值3(二进制11)表示遇到了错误1和2(二进制1和10)。我正在寻找一个在powershell中自动将其转换为数组的函数。

我环顾互联网,找不到任何特别的情况。我编写了一个可以执行此操作的函数,但如果用户不熟悉位掩码,那么它的可读性不高。

编辑具体来说,我正在寻找一个带有“原始”错误位并使用它来返回错误数组的函数。例如:

GetErrorList 3779

返回一个包含:

的数组

1, 2, 64, 128, 512, 1024, 2048

3 个答案:

答案 0 :(得分:5)

设置一个包含每个位翻译的哈希表,并使用二进制AND运算符(-band)来查找引发的错误:

function Get-ErrorDescription {

    param([int]$ErrorBits)

    $ErrorTable = @{
        0x01 = "Error1"
        0x02 = "Error2"
        0x04 = "Error3"
        0x08 = "Error4"
        0x10 = "Error5"
        0x20 = "Error6"
    }

    foreach($ErrorCode in $ErrorTable.Keys | Sort-Object){
        if($ErrorBits -band $ErrorCode){
            $ErrorTable[$ErrorCode]
        }
    }
}

返回找到的错误字符串数组,或$null

PS C:\> Get-ErrorDescription -ErrorBits 3
Error1
Error2

答案 1 :(得分:3)

编辑:我在Powershell 5中找到了一个非常酷的方法来使用枚举标志:

[flags()] Enum ErrorTable
{
  Error1 = 0x01
  Error2 = 0x02
  Error3 = 0x04
  Error4 = 0x08
  Error5 = 0x10
  Error6 = 0x20
}

PS C:\> $errorcodes = [ErrorTable]'Error1,Error2'
PS C:\> $errorcodes
Error1, Error2
PS C:\> $errorcodes = [ErrorTable]3
PS C:\> $errorcodes
Error1, Error2

答案 2 :(得分:0)

我最近遇到了一个与OP非常相似的问题。这个问题有点老了,但这可能会对其他人有所帮助。

正如js2010所述,您可以使用enumeration defined as a collection of bit flags来达到最佳效果:

[flags()] Enum ErrorTable {
    Error1 = 1
    Error2 = 2
    Error3 = 4
    Error4 = 8
    Error5 = 16
    Error6 = 32
    Error7 = 64
    Error8 = 128
    Error9 = 256
    Error10 = 512
    Error11 = 1024
    Error12 = 2048
}

function GetErrorList ([int]$ValueIn) {
    [ErrorTable]$ValueIn
}

GetErrorList实际上返回错误字符串,如果您希望使用数组,则将函数中的单行更改为:

[ErrorTable]$ValueIn -split ', '

这实际上并不能回答OP提出的确切问题,但是可以通过以下方式回答(没有枚举)(当然,还有更有效,更优雅的方法):

function GetErrorListNumeric ([int]$ValueIn) {

    $s = [System.Convert]::ToString($ValueIn,2)
    $values = @()
    while ($s.length -ge 1) {
        if ($s[0] -eq '1') { $values += [Math]::Pow(2,$s.length-1) }
        $s = $s -replace '^.', ''
    }

    [array]::Reverse($values)
    $values

}

就我而言,我需要将位标志转换为更长的消息字符串。不适用于枚举,但是可以使用哈希将枚举的值转换为这样,

$ErrorMessages = @{
    Error1 = 'error #1'
    Error2 = 'error #2'
    Error3 = 'error #4'
    Error4 = 'error #8'
    Error5 = 'error #16'
    Error6 = 'error #32'
    Error7 = 'error #64'
    Error8 = 'error #128'
    Error9 = 'error #256'
    Error10 = 'error #512'
    Error11 = 'error #1024'
    Error12 = 'error #2048'
}

然后,此函数会将原始位掩码转换为组件错误消息:

function GetErrorList ([int]$ValueIn) {
    $ErrorMessages[([ErrorTable]$ValueIn -split ', ')]
}