如何漂亮地打印为十六进制打印为 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()
我有一些 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()