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

5

我的目标是从一个文本文件中获取MAC地址并将其值递增一。

我在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)

5
([Int64]::Parse('00155DE10B73', 'HexNumber') + 1).ToString('X12') - user4003407
2个回答

8

这是一个三步骤的过程,尽管PetSerAl在评论中已经用一行代码回答了它,但我会稍微分解一下以供后人参考(并使用不同的类)。

第一步是将十六进制数转换为十进制数(按照数学基数10来算,而不是类型)。

第二步是递增十进制数。

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

如果将其分解开来而不是写成一行,就可以完成手头的任务。

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

1
不错的回答。但是 Convert.ToInt64() 在内部调用了 Int64.Parse(),同样地,Convert.ToString(val) 在内部调用了 val.ToString(),因此从技术上讲,您确实使用了与 @PetSerAl 评论中相同的类 :-) - Mathias R. Jessen
谢谢,@MathiasR.Jessen!我从未看过它的内部结构,这很有用。 - Austin T French

4
另一种选择是在值前加上0x并将其强制转换为int64:
$Next_MAC_Address = ([int64]"0x$Last_MAC_Address"+1).ToString('X12')

您也可以使用格式化运算符 (-f) 而不是 ToString() 方法:

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

然而,有一件事情值得注意。 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}$)'

或者像这样:

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

只增加网卡标识符,仅在不会溢出的情况下进行增加:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接