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

Con*_*989 5 powershell hex

因此,基本上我想要实现的是从文本文件中获取MAC地址并将该值加1。

在Google / StackOverflow墙上猛烈抨击了几个小时,以为我没有一个概念。

电源外壳:

$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)
Run Code Online (Sandbox Code Playgroud)

Aus*_*nch 7

这是一个3个步骤的过程,尽管PetSerAl在评论中回答了一个问题,但我还是将其细分为后代(并使用其他类)。

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

第二步是小数的增量。

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

细分,而不是一个班轮,这将完成手头的任务:

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


Ans*_*ers 4

另一种选择是为值添加前缀0x并将其转换为int64:

$Next_MAC_Address = ([int64]"0x$Last_MAC_Address"+1).ToString('X12')
Run Code Online (Sandbox Code Playgroud)

您还可以使用格式运算符( -f) 代替ToString()方法:

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

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

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

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

或者像这样:

$oui = $Last_MAC_Address.Substring(0, 6)
$nid = $Last_MAC_Address.Substring(6, 6)
Run Code Online (Sandbox Code Playgroud)

并仅增加 NIC 标识符,并且仅在它不会溢出的情况下:

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