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