如何解码SNMP返回的OctetString格式打印机安装日期?
解码SNMP OID .1.3.6.1.4.1.641.6.2.3.1.7.1的日期值
这个OID返回的OctetString是变种的ASN.1 GeneralizedTime格式,前7个字节依次对应年(2字节)、月、日、时、分、秒,后续为保留字段。针对你提供的十六进制值07 DF 06 14 0D 30 0E 00 00 00 00 00,解码步骤如下:
解码逻辑
- 年份:前2字节
07 DF转十进制为0x07DF = 7*256 + 223 = 2015 - 月份:第3字节
06转十进制为6 - 日期:第4字节
14转十进制为20 - 时间(可选):第5-7字节
0D 30 0E分别对应13时、48分、14秒
修改后的VBA解码代码
Set objSNMP = CreateObject("OlePrn.OleSNMP") objSNMP.Open "10.158.110.8", "public", 2, 10000 ' 获取原始二进制字符串 Dim rawData As String rawData = objSNMP.get(".1.3.6.1.4.1.641.6.2.3.1.7.1") ' 转换为字节数组(解决乱码问题) Dim bytes() As Byte bytes = StrConv(rawData, vbFromUnicode) ' 解析核心日期字段 Dim printYear As Integer, printMonth As Integer, printDay As Integer printYear = (bytes(0) * 256) + bytes(1) printMonth = bytes(2) printDay = bytes(3) ' 输出格式化日期(与网页显示一致) Debug.Print printYear & "-" & Format(printMonth, "00") & "-" & Format(printDay, "00") ' 可选:解析并输出完整时间 Dim printHour As Integer, printMinute As Integer, printSecond As Integer printHour = bytes(4) printMinute = bytes(5) printSecond = bytes(6) Debug.Print printYear & "-" & Format(printMonth, "00") & "-" & Format(printDay, "00") & " " & _ Format(printHour, "00") & ":" & Format(printMinute, "00") & ":" & Format(printSecond, "00")
说明
- 直接
Debug.Print返回乱码是因为OlePrn.OleSNMP返回的是二进制字符串,而非可打印文本,必须转成字节数组才能解析。 - 后续的
00字节为保留或时区字段,不影响日期解析。
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

