如何正确地将通过OleSNMP获得的IP地址转换为可使用的值?
我试图编写一个Powershell脚本来使用SNMP查询设备,然后显示数据。对于简单类型来说,这些东西工作得很好,但是我的IP地址(和MAC地址)有问题,但我们现在还是坚持使用IP吧。
下面是我所做的(简化为问题空间):
param ($ipaddr='10.1.128.114', $community='Public')
$snmp = New-Object -ComObject oleprn.OleSNMP
$snmp.open($ipaddr, $community)
$result = $snmp.get(".1.3.6.1.2.1.4.20.1.1.10.1.128.114")
$enc = [system.Text.Encoding]::ASCII
$bytes = $enc.GetBytes($result)
write-host( "bytes:" + $bytes)其中产出:
bytes:10 1 63 114
当我期待
bytes:10 1 128 114
相比之下,snmp-get输出:
$ snmpget 10.1.128.114 -c Public -v2c -On .1.3.6.1.2.1.4.20.1.1.10.1.128.114
.1.3.6.1.2.1.4.20.1.1.10.1.128.114 = IpAddress: 10.1.128.114是的,我意识到在我的最后一个脚本中,我将不得不遍历表,而不是直接使用"get“,但是我需要首先修复我的解析。
发布于 2022-05-26 22:05:03
正如注释中提到的,ASCII编码用问号?替换其有效范围以外的字符,这是ASCII字符63。
更多信息可在ASCIIEncoding.GetBytes文档中找到--搜索"?“你会发现这个:
ASCIIEncoding不提供错误检测。任何大于U+007F的Unicode字符都被编码为ASCII问号("?")。
注意,0x7F是127,所以由于[char] 128超出了这个范围,所以当您调用GetBytes时,它将被转换为? (也就是63)的字节等效。
您的代码基本上就是这样做的:
$result = ([char] 10) + ([char] 1) + ([char] 128) + ([char] 114)
$encoding = [System.Text.Encoding]::ASCII
$bytes = $encoding.GetBytes($result)
$bytes
# 10
# 1
# 63 (i.e. "?")
# 114您需要使用一个编码器,它可以将高于0x7F的字符转换为等效的字节--类似于iso-8859-1这样的代码似乎有效:
$result = ([char] 10) + ([char] 1) + ([char] 128) + ([char] 114)
$encoding = [System.Text.Encoding]::GetEncoding("iso-8859-1")
$bytes = $encoding.GetBytes($result)
$bytes
# 10
# 1
# 128
# 114https://stackoverflow.com/questions/72397525
复制相似问题