如何漂亮地打印为十六进制打印为 ascii 的 asn1 八位字节字符串

How to prettyprint as hex a pyasn1 octect string that is printed as ascii

我有一些 pyasn1 octect 字符串对象定义如下:

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

当我使用 pyasn.1 库解码 asn.1 时,它将值转换为它的 ascii 表示形式,例如我得到“&/”,但我需要显示数值,以十六进制表示。例如,在这种情况下,我需要 262F 而不是 &/。 显然我可以提取 &/ 或我在其中找到的任何内容并手动转换它,例如:

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

但我无法以这种格式将其写回字段中。

有没有一种简单的方法可以在不修改 asn.1 定义(我可以t 改变,因为它是给我的)?

您可以做的是子class OctetString class,覆盖其 prettyPrint 方法,然后向解码器注册新的 class。您的 prettyPrint returns 最终会付诸印刷。

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