如何将十六进制编码的字符串转换为十六进制整数

时间:2016-07-09 08:02:31

标签: powershell hex

所以基本上我想要实现的是从文本文件中获取MAC地址并将值递增1。

在Google / StackOverflow墙上砸了几个小时,认为这是一个我没有得到的概念。

的PowerShell:

$Last_MAC_Address = (Get-Content -LiteralPath "\\UNC\Path\Last MAC Address.txt")

Write-Host ($Last_MAC_Address)
# Output: 00155DE10B73

$Next_MAC_Address = (($Last_MAC_Address | Format-Hex) + 1)

2 个答案:

答案 0 :(得分:5)

这是一个3步骤的过程,虽然PetSerAl在评论中作为单行代码回答了它,但我会稍后将其分解为后代(并使用不同的类)。

第一步是将十六进制数作为十进制数(数学基数10,而不是类型)。

第二步是小数的增量。

最后一步是将其转换回十六进制。

分解而不是一个衬里,这将完成手头的任务:

$asDecimal = [System.Convert]::ToInt64("00155DE10B73", 16)
$asDecimal++
$asHex = [System.Convert]::ToString($asDecimal, 16)

答案 1 :(得分:3)

另一种选择是使用0x作为前缀,并将其转换为int64

$Next_MAC_Address = ([int64]"0x$Last_MAC_Address"+1).ToString('X12')

您还可以使用format operator-f)代替ToString()方法:

$Next_MAC_Address = '{0:X12}' -f ([int64]"0x$Last_MAC_Address"+1)

然而,有一件事值得注意。 MAC addresses不仅仅是随机的6字节数字,没有任何内部结构。它们实际上由两部分组成。前3个字节组成Organizationally Unique Identifier(OUI),特定于供应商的前缀(00-15-5D是属于Microsoft的OUI之一)。只有最后3个字节是随机数,是OUI识别的供应商每张卡的唯一标识符。

考虑到这一点,您可能需要相应地拆分MAC地址,例如像这样:

$oui, $nid = $Last_MAC_Address -split '(?<=^[0-9a-f]{6})(?=[0-9a-f]{6}$)'

或者像这样:

$oui = $Last_MAC_Address.Substring(0, 6)
$nid = $Last_MAC_Address.Substring(6, 6)

并仅增加NIC标识符,并且仅在它不会溢出时才会增加:

if ($nid -ne 'ffffff') {
  $Next_MAC_Address = "{0}{1:X6}" -f $oui, ([int64]"0x$nid"+1)
} else {
  Write-Error 'MAC address overflow.'
}