将十六进制字符串转换为base36字符串

时间:2018-02-23 03:15:52

标签: powershell

在AWS中,每个实例的ID都如下所示:i-1234567890abcdef;最后16个字符是十六进制数。我想对待" 1234567890abcdef" part作为十六进制数并将其转换为base36,所以a-z0-9。这种方式我可以使用是作为计算机的名称,而不是超过15个字符的限制。怎么在Powershell中完成?

1 个答案:

答案 0 :(得分:1)

从十六进制转换输入很简单:跳过前两个字符,然后转换为UInt64:

[convert]::ToUInt64($text.Substring(2), 16)

但PowerShell(.Net)没有内置的转换为基础36的方法。您需要自己实现它,例如此代码取自https://ss64.com/ps/syntax-base36.html并针对较大的数字进行了调整:

function convertTo-Base36
{
    [CmdletBinding()]
    param (
        [parameter(valuefrompipeline=$true, HelpMessage="Integer number to convert")]
        [uint64]$DecimalNumber=""
    )

    $alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"

    do
    {
        $remainder = ($DecimalNumber % 36)
        $char = $alphabet.Substring($remainder, 1)
        $base36Num = "$char$base36Num"
        $DecimalNumber = ($DecimalNumber - $remainder) / 36
    }
    while ($DecimalNumber -gt 0)

    $base36Num
}

然后:

$x='i-1234567890abcdef'
$hexPart = $x.Substring(2)
$decimal = [convert]::ToUInt64($hexPart, 16)

convertTo-Base36 $decimal

# -> 9YS742MX86WF

或:

[convert]::ToUInt64('i-1234567890abcdef'.Substring(2), 16) | Convertto-Base36