Powershell:将八位字节字符串(SNMP)输出转换为十六进制(Mac地址)
因此,我将很快解释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值有什么样的数据类型:它是八进制字符串。在接下来的步骤中,我开始寻找可能性,如何将这个八位字节字符串值转换成可读的十六进制-直到现在,没有任何进展。我尝试通过以下方式将其转换为字节: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
$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 '-'