【发布时间】:2021-09-30 19:25:58
【问题描述】:
我正在尝试在 PowerShell 中复制以下 Python 代码段的功能:
allowed_mac_separators = [':', '-', '.']
for sep in allowed_mac_separators:
if sep in mac_address:
test = codecs.decode(mac_address.replace(sep, ''), 'hex')
b64_mac_address = codecs.encode(test, 'base64')
address = codecs.decode(b64_mac_address, 'utf-8').rstrip()
它需要一个 MAC 地址,删除分隔符,将其转换为十六进制,然后是 base64。 (我没有编写 Python 函数,也无法控制它或它是如何工作的。)
例如,MAC 地址AA:BB:CC:DD:E2:00 将转换为AABBCCDDE200,然后转换为b'\xaa\xbb\xcc\xdd\xe2\x00',最后作为输出b'qrvM3eIA'。我尝试做类似的事情:
$bytes = 'AABBCCDDE200' | Format-Hex
[System.BitConverter]::ToString($bytes);
但这会产生MethodException: Cannot find an overload for "ToString" and the argument count: "1".,我不确定它在寻找什么。我发现使用该调用的所有示例都只有一个参数。这有效:
[System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes('AABBCCDDE200'))
但显然不会先将其转换为十六进制,因此会产生不正确的结果。任何帮助表示赞赏。
【问题讨论】:
-
使用
$bytes的.Bytes方法怎么样?例如运行:[System.Convert]::ToBase64String($bytes.Bytes). -
MAC 地址已经是十六进制。 python 脚本看起来像它解码 MAC 从十六进制到 UTF8,然后将字节编码为 base64,就像你在 powershell 中的
[System.Convert]代码一样。 -
另外,使用
$bytes.Bytes将修复您看到的错误,但它等效于UTF8.GetBytes方法 -
很高兴了解
.Bytes,@Cpt.Whale;请注意,在 Windows PowerShell 中,它是 - 有损 -ASCII.GetBytes方法。虽然这种区别在手头的情况下并不重要,但请注意,在这种情况下使用.Bytes将不工作,因为您将有效地获得反映 ASCII 代码点的字节值 个字符,例如A- 而需要将这些字符解释为 hex 数字。
标签: powershell base64 hex