Как распечатать как шестнадцатеричную строку октета pyasn1, которая печатается как ascii - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть некоторые pyasn1 объекты строки октета, определенные следующим образом:

LInfo.componentType = namedtype.NamedTypes(namedtype.NamedType('XXX', univ.OctetString().subtype(subtypeSpec=constraint.ValueSizeConstraint(2, 2)).subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0)))

Когда я декодирую asn.1 с использованием библиотеки pyasn.1, она переводит значение в представление ascii, например, Iполучить "&/", но мне нужно показать числовое значение в шестнадцатеричном представлении.Например, в этом случае вместо &/ мне нужно 262F.Очевидно, что я могу извлечь &/ или что-то еще там и преобразовать его вручную, например:

value.asOctects().encode("HEX")

, но тогда я не могу записать его обратно в поле в этом формате.

Существует ли простой способ манипулирования объектом перед его печатью таким образом, чтобы я мог видеть 262F в окончательном симпатичном отпечатке без изменения определения asn.1 (которое я не могу изменить какэто мне дано)?

1 Ответ

0 голосов
/ 15 ноября 2018

Что вы можете сделать, это создать подкласс класса OctetString, переопределить его метод prettyPrint и зарегистрировать новый класс в декодере. То, что возвращает prettyPrint, - это то, что в конечном итоге выходит в печать.

from pyasn1.codec.ber import decoder
from pyasn1.type import univ


class OctetString(univ.OctetString):
    def prettyPrint(self):
        return self._value


class OctetStringDecoder(decoder.OctetStringDecoder):
    protoComponent = OctetString('')


decoder.tagMap[OctetString.tagSet] = OctetStringDecoder()
decoder.typeMap[OctetString.typeId] = OctetStringDecoder()

Вот оригинальный код .

...