如何使用Sharp Snmp库解析hrPrinterDetectedErrorState及同类比特串?
使用SharpSnmpLib解析hrPrinterDetectedErrorState这类比特串
我刚好有过用SharpSnmpLib处理这类SNMP比特串的经验,给你梳理下具体的做法:
一、SharpSnmpLib有没有对应的比特串类型?
有的,SharpSnmpLib里用OctetString类型来承载SNMP中的BIT STRING(比特串)数据。这类位掩码形式的OID返回值,最终都会被封装成OctetString实例,你可以直接通过它的Value属性获取原始字节数组。
二、解析位掩码的核心逻辑
hrPrinterDetectedErrorState这类OID返回的是位掩码,每个位对应一个具体的错误状态(比如bit0对应"other",bit1对应"noError"等)。需要注意的是SNMP的BIT STRING编码规则:
- 字节采用大端序传输
- 每个字节的最高位(bit7)对应MIB定义中的最低位编号(比如第一个字节的bit7对应MIB的bit0),依次类推,字节的最低位(bit0)对应该字节的第7个MIB位编号。
不管返回的是1、2还是4字节,都可以用统一的逻辑遍历每个位来判断状态。
三、完整代码示例
假设你已经通过SharpSnmpLib的GetRequest获取到了目标OID的OctetString数据,下面是解析的具体代码:
using System; using System.Collections.Generic; using Lextm.SharpSnmpLib; // 假设你已经获取到hrPrinterDetectedErrorState的OctetString实例 OctetString errorStateOctet = /* 你的SNMP请求结果 */; byte[] errorStateBytes = errorStateOctet.Value; // 定义MIB中每个位对应的错误状态(完全匹配hrPrinterDetectedErrorState的定义) var errorStateMapping = new Dictionary<int, string> { {0, "other"}, {1, "noError"}, {2, "lowPaper"}, {3, "noPaper"}, {4, "lowToner"}, {5, "noToner"}, {6, "doorOpen"}, {7, "jammed"}, {8, "offline"}, {9, "serviceRequested"}, {10, "inputTrayMissing"}, {11, "outputTrayMissing"}, {12, "markerSupplyMissing"}, {13, "markerSupplyLow"}, {14, "markerSupplyEmpty"}, {15, "markerWasteAlmostFull"}, {16, "markerWasteFull"}, {17, "fuserOverTemp"}, {18, "fuserUnderTemp"}, {19, "opcNearEOL"}, {20, "opcEOL"}, {21, "developerLow"}, {22, "developerEmpty"}, {23, "interpreterResourceUnavailable"} }; var detectedErrors = new List<string>(); // 遍历每个字节,解析每个位 for (int byteIndex = 0; byteIndex < errorStateBytes.Length; byteIndex++) { byte currentByte = errorStateBytes[byteIndex]; // 从字节的最高位(bit7)到最低位(bit0)遍历,对应MIB的位编号依次递增 for (int bitPosInByte = 7; bitPosInByte >= 0; bitPosInByte--) { // 提取当前位的值 int bitValue = (currentByte >> bitPosInByte) & 1; // 计算对应的MIB位编号 int mibBitNumber = byteIndex * 8 + (7 - bitPosInByte); if (bitValue == 1 && errorStateMapping.ContainsKey(mibBitNumber)) { detectedErrors.Add(errorStateMapping[mibBitNumber]); } } } // 输出检测到的错误 Console.WriteLine("Detected printer errors:"); foreach (var error in detectedErrors) { Console.WriteLine($"- {error}"); }
四、额外提示
如果需要直接用整数位运算判断,也可以把字节数组转换为对应长度的整数(byte/ushort/uint),但要注意SNMP是大端序,如果你的系统是小端序,需要先反转字节顺序再转换,否则会出现位映射错误。相比之下,直接遍历字节的方式更稳妥,不需要考虑字节序问题。
内容的提问来源于stack exchange,提问作者js2010
相关产品推荐
相关产品推荐

