如何将十六进制的pyasn1 octect字符串打印为ascii

时间:2018-11-14 10:29:48

标签: python asn.1 pyasn1

我有一些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表示形式,例如,我得到了“ &/”,但是我需要在十六进制表示。例如,在这种情况下,我需要&/而不是262F。 显然,我可以提取&/或在那里找到的任何内容,然后手动进行转换,例如:

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

但是我不能以这种格式将其写回字段中。

在打印对象之前,是否有一种简便的方法来操作对象,使得我可以在最终的漂亮打印中看到262F而无需修改asn.1定义(我无法更改)是给我的?)

1 个答案:

答案 0 :(得分:0)

您可以做的是将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()

这里是the original code