Powershell:将八位字节字符串(SNMP)输出转换为十六进制(Mac地址)

Powershell:将八位字节字符串(SNMP)输出转换为十六进制(Mac地址),powershell,snmp,printers,octetstring,Powershell,Snmp,Printers,Octetstring,因此,我将很快解释env: 需要在带有Powershell 4.0的Win2k8服务器上工作 我想通过使用SNMP获得一些信息(例如打印机类型和打印机MAC地址): 因此,输出如下所示(作为示例): $PType=HP Officejet Pro 251dw打印机 $PMac=* 因此,首先,我开始检查我是否使用了正确的OID——使用SnmpSoft公司的命令行工具。在那里,输出看起来很好: OID=OID=.1.3.6.1.2.1.2.2.1.6.2 类型=八进制字符串 值=A0 D3 C1

因此,我将很快解释env: 需要在带有Powershell 4.0的Win2k8服务器上工作

我想通过使用SNMP获得一些信息(例如打印机类型和打印机MAC地址):

因此,输出如下所示(作为示例):

$PType=HP Officejet Pro 251dw打印机

$PMac=*

因此,首先,我开始检查我是否使用了正确的OID——使用SnmpSoft公司的命令行工具。在那里,输出看起来很好:

OID=OID=.1.3.6.1.2.1.2.2.1.6.2

类型=八进制字符串

值=A0 D3 C1 D4 2A 95….*

好的,我开始检查,这个OID值有什么样的数据类型:它是八进制字符串。在接下来的步骤中,我开始寻找可能性,如何将这个八位字节字符串值转换成可读的十六进制-直到现在,没有任何进展。我尝试通过以下方式将其转换为字节:

$bytes = [System.Text.Encoding]::Unicode.GetBytes($PMac) 
[System.Text.Encoding]::ASCII.GetString($bytes)
echo $bytes
但是输出让我很困惑

一百六十 0 211 0 193 0 212 0 42 0 34 三十二

试图解释此输出,但没有成功。谷歌再也帮不了我了,因为我也不太明白怎么搜索或搜索什么


因此,我在这里希望得到一些帮助或建议,如何将此查询的输出更改为可读的内容。

您得到的输出非常接近您预期的MAC地址

160 0 2110 193 0 212 0 42 0 34 32

160
是十六进制的十进制
0xA0

211
0xD3

193
0xC1

每个字节之间的附加零可能是在Unicode.GetBytes调用期间添加的,我认为您不需要使用它

我猜想您需要将
$PMac
作为字节数组读取,然后对每个字节进行十六进制字符串转换。这可能不是最优雅的,但可以完成工作:

[byte[]] $arrayofBytes = @(160,211,193)

[string] $hexString
foreach ($b in $arrayofBytes) {
    $HexString += [convert]::toString($b,16)
    $HexString += ' '
}

这是一个编码问题

。所以我希望这个值是接口的MAC地址。您的命令行结果以A0-D3-C1开始,这是一个,所以它是一致的。您的打印机MAC地址必须是A0 D3 C1 D4 2A 95?你没有说,所以你让我猜

我怀疑
$PMac
应该是
[byte[]]
(字节数组),但输出将其转换为字符串,PowerShell的输出系统将其解释为字符

例如:

PS C:\> [byte[]]$bytes = 0xa0, 0xd3, 0xc1, 0xd4, 0x2a, 0x95
PS C:\> [System.Text.Encoding]::Default.GetString($bytes)
 ÓÁÔ*•
您可能需要这样做:

$MAC = [System.Text.Encoding]::Default.GetBytes($PMac) | ForEach-Object {
    $_.ToString('X2')
}
$MAC = $MAC -join '-'
您可能希望改用
[System.Text.Encoding]::ASCII.GetBytes($PMac)
,因为原始SNMP应该使用ASCII编码。我不知道olePrn.OleSNMP使用什么

您还可以查看其中一个。这将比在PowerShell中处理COM对象容易得多


我也遇到过#SNMP是一个.Net SNMP库,
OCTET STRING
似乎是此OID的基础类型。本页介绍了使用.Net处理此特定对象类型的一些困难。您还可以使用此库在PowerShell;中开发自己的cmdlet

$PMac.GetType()的输出是什么?
$MAC = [System.Text.Encoding]::Default.GetBytes($PMac) | ForEach-Object {
    $_.ToString('X2')
}
$MAC = $MAC -join '-'