Excel中用VBA通过SNMP采集交换机数据:OCTET类型转换难题
解决VBA中SNMP OCTET类型数据转换问题
问题根源
OCTET STRING类型的SNMP数据本质是原始字节序列,OlePrn.OleSNMP的GetTree方法会将其按Unicode字符串解析,导致出现乱码(比如示例中的"€")。需要手动将这些字符串转回字节数组,再根据实际需求解析。
转换方案
1. 字符串转字节数组函数
先编写一个VBA函数,把返回的乱码字符串转换成原始字节数组:
Function StringToByteArray(str As String) As Byte() Dim byteArr() As Byte Dim i As Integer ReDim byteArr(Len(str) - 1) For i = 1 To Len(str) byteArr(i - 1) = AscB(Mid(str, i, 1)) Next i StringToByteArray = byteArr End Function
2. 处理GetTree返回的表格数据
遍历portsRBID二维数组,逐个转换元素:
Set objSNMP = CreateObject("OlePrn.OleSNMP") objSNMP.Open "192.168.110.250", "public", 2, 1000 portsRBID = objSNMP.GetTree(".1.3.6.1.4.1.248.12.1.2.15.11.1.250") Dim rowCount As Integer, colCount As Integer Dim byteData() As Byte Dim i As Integer, j As Integer rowCount = UBound(portsRBID, 1) colCount = UBound(portsRBID, 2) ' 遍历每个元素转换并输出 For i = 1 To rowCount For j = 0 To colCount If VarType(portsRBID(i, j)) = vbString Then byteData = StringToByteArray(portsRBID(i, j)) ' 可根据需求处理字节数组,比如转十六进制 Debug.Print "portsRBID(" & i & "," & j & ") 原始字节: " & ByteArrayToHex(byteData) End If Next j Next i
3. 字节数组转十六进制(可选)
如果需要将字节数组转为可读性更强的十六进制字符串,添加以下函数:
Function ByteArrayToHex(byteArr() As Byte) As String Dim hexStr As String Dim i As Integer hexStr = "" For i = LBound(byteArr) To UBound(byteArr) hexStr = hexStr & Right("0" & Hex(byteArr(i)), 2) & " " Next i ByteArrayToHex = Trim(hexStr) End Function
关于GetAsByte和单个OID报错的说明
GetAsByte方法仅支持单个OID查询,无法用于返回多个节点的表格类OID,因此调用时会报错。- 指定单个元素时OID报错,大概率是OID格式错误:表格类OID的索引部分不需要加
.0,比如正确的单个元素OID应为.1.3.6.1.4.1.248.12.1.2.15.11.1.250.3(假设索引为3),而非.1.3.6.1.4.1.248.12.1.2.15.11.1.250.0.3。可先通过MIB浏览器确认设备上实际存在的OID节点。
内容的提问来源于stack exchange,提问作者Carlos Beltrame
相关产品推荐
相关产品推荐

