Как преобразовать шестнадцатеричное значение, которое я получаю от SNMP?

Я использую PYSNMP в качестве инструмента для работы с SNMP.
Многие из OID в snmp представлены шестнадцатеричными значениями.
Вот пример серийного номера OID:

1.3.6.1.4.1.1602.1.2.1.4.0 = Hex-String: 0115434e443846374d485646

Я мог бы преобразовать это шестнадцатеричное значение в более понятный тип, преобразовав его в целое число или в строку.
Проблема в том, что у меня нет возможности узнать предполагаемый тип шестнадцатеричного значения, будь то строка или целое число.
Так, например, шестнадцатеричная строка 0115434e443846374d485646при преобразовании в строку равно CND8F7MHVF, но при преобразовании в целое число равно 335190294349398493576582726,
В этом примере шестнадцатеричное значение должно быть преобразовано в строку, если я хочу получить правильный результат, но в других случаях мне может понадобиться преобразовать шестнадцатеричное значение в целое число, чтобы получить правильный результат, потому что серийные номера также могут быть целые числа.
Как мне преобразовать шестнадцатеричную строку, чтобы получить предполагаемое значение шестнадцатеричной строки?

2 ответа

В SNMP значения HEX чаще ассоциируются с типом OCTET STRING, чем с INTEGER.

Когда SNMP помещает INTEGER в пакет, он четко помечается как таковой. После получения вы всегда знаете, что это INTEGER, поэтому вы можете преобразовать его в любую базу, какую пожелаете, и это не изменит ее семантику или значение.

Тип OCTET STRING вмещает последовательность байтов. Это может представлять печатную строку или MAC-адрес или, возможно, что-то конкретное для приложения. Независимо от содержимого значение в проводе помечается одинаково (например, на уровне пакета). Поэтому единственный способ выяснить, как интерпретировать конкретное значение OCTET STRING, - это посмотреть OID, связанный с этим значением (через определение OBJECT-TYPE в MIB).

Чтобы помочь интерпретировать базовые типы SNMP (и особенно OCTET STRING), SNMP имеет фиктивный тип, называемый TEXTUAL-CONVENTION. Он определяет расположение октетов в OCTET STRING для автоматического создания чего-то удобного для человека.

В случае pysnmp все, что вам нужно, это загрузить MIB там, где определен управляемый объект, и позволить pysnmp сделать все остальное, применив.prettyPrint() к объектам, которые он возвращает.

Видимо, вы делаете это неправильно, когда вы конвертируете MAC-АДРЕС (который по определению HEX-BASED) в STRING.

Обычно точный тип типа в SNMP определяется в MIB-s, эти типы основаны на ограниченном подмножестве типов SMIv1/SMIv2 и не должно быть никаких недоразумений.

Другие вопросы по тегам