我有一小部分代码:
from pyasn1.type import univ
from pyasn1.codec.ber import decoder
decoder.decode(binary_file.read(5))
我的binary_file变量它是一个特定的二进制文件编码(CDR)
如果我尝试解码readed部分,它会给我这个错误:
pyasn1.error.PyAsn1Error: [128:0:0]+[128:32:79] not in asn1Spec: None
我该如何解决?
答案 0 :(得分:1)
除非您正在解码仅包含基本ASN.1类型(例如INTEGER,SEQUENCE等)的数据结构,否则您需要将顶级ASN.1数据结构对象传递给解码器。这样解码器可以匹配自定义标签(BER / DER / CER序列化中的TLV元组)与数据结构对象中存在的相同标签。例如:
custom_int_type = Integer().subtype(implicitTag=Tag(tagClassContext, tagFormatSimple, 40))
custom_int_instance = custom_int_type.clone(12345)
serialization = encode(custom_int_instance)
# this will fail on unknown custom ASN.1 type tag
custom_int_instance, rest_of_serialization = decode(serialization)
# this will succeed as custom ASN.1 type (containing tag) is provided
custom_int_instance, rest_of_serialization = decode(serialization, asn1Spec=custom_int_type)
以下是指向pyasn1 documentation on decoders的链接。
要将ASN.1语法传递给pyasn1解码器,您必须先将语法转换为对象的pyasn1 / Python树。这是一次性操作,有时可以使用asn1late工具自动执行。
我的另一个问题是你可能正在读取序列化数据的一小部分(5个八位字节)。如果使用“无限长度编码模式”序列化数据,那么这可能是一个有效的操作,否则解码器可能会因输入不足而失败。