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

Powershell 将十六进制字符串转换为base36字符串,powershell,Powershell,在AWS中,每个实例都有一个类似这样的ID:i-1234567890abcdef;最后16个字符是十六进制数。我想将“1234567890abcdef”部分视为十六进制数,并将其转换为base36,因此a-z0-9。这样我就可以使用is作为计算机名,而不超过15个字符的限制。在Powershell中是如何实现的?从十六进制转换输入非常简单:跳过前两个字符,然后转换为UInt64: [convert]::ToUInt64($text.Substring(2), 16) 但是PowerShell(

在AWS中,每个实例都有一个类似这样的ID:i-1234567890abcdef;最后16个字符是十六进制数。我想将“1234567890abcdef”部分视为十六进制数,并将其转换为base36,因此a-z0-9。这样我就可以使用is作为计算机名,而不超过15个字符的限制。在Powershell中是如何实现的?

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

[convert]::ToUInt64($text.Substring(2), 16)
但是PowerShell(.Net)没有内置的转换为base 36的方法。您需要自己实现它,例如,此代码取自并针对较大的数字进行了调整:

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
}
然后:

或:


你要的是算法吗?@vonPryz,我要的是.net/powershell实现。在不同的基之间转换非常简单。
$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