Python 如何解决ASN.1库不支持相对OID的问题
我试图使用Python库对符合标准的BER消息进行解码和编码 在某些地方使用ASN.1的Python 如何解决ASN.1库不支持相对OID的问题,python,asn.1,pyasn1,asn1tools,Python,Asn.1,Pyasn1,Asn1tools,我试图使用Python库对符合标准的BER消息进行解码和编码 在某些地方使用ASN.1的相对OID类型。但是,asn1tools不知道这种类型,可能是因为底层的pyasn1库没有实现它(还没有,还没有)。这就是为什么我不能在Python程序中使用DTD。但我真的必须这么做 在我看来,我的选择是创建包含RELATIVE-OIDPR的pyasn1补丁版本,并使asn1tools与之配合使用,或者以某种方式在DTD中构建解决方案 我已经尝试向DTD添加RELATIVE-OID::=[UNIVERSAL
相对OID
类型。但是,asn1tools
不知道这种类型,可能是因为底层的pyasn1
库没有实现它(还没有,还没有)。这就是为什么我不能在Python程序中使用DTD。但我真的必须这么做
在我看来,我的选择是创建包含RELATIVE-OID
PR的pyasn1
补丁版本,并使asn1tools
与之配合使用,或者以某种方式在DTD中构建解决方案
我已经尝试向DTD添加RELATIVE-OID::=[UNIVERSAL 13]八进制字符串
,但是现在asn1tools
响应预期RELATIVE-OID,在偏移量10处标记为“2d”,但得到了“0d”。
基本上它似乎接受我的定义,但使其成为“UNIVERSAL-constructed 13”,而消息将其标记为“通用基本13”
我有办法解决这个问题吗
以下是我的限制:
- 我基本上必须使用
,我的代码已经严重依赖它了asn1tools
- 我必须能够解析和创建与其他第三方客户端兼容的消息,这些客户端将这些字段标记为
0d
- 我可以在DTD中随意编辑,例如添加定义
(但以何种方式?)的类型,或者用其他内容替换RELATIVE-OID
,只要它仍能与标记字段为RELATIVE-OID
的消息一起工作0d
- 我完全可以将
值作为一个不透明的RELATIVE-OID
块之类的东西来获取,这就是为什么我首先尝试了bytes
解决方法OCTET字符串
导入ASN1工具
spec=asn1tools.compile_文件('GlowDtd.asn1'))
打印(spec.decode('Root',b'`\x80k\x80\xa0\x80b\x80\xa0\x03\x02\x01\xa1\x03\x02\x01\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00'))
#应导致('elements',[('element',('command',{'number':32,'options':('dirFieldMask',-1)}]))
打印(spec.decode('Root',b'`\x80k\x80\xa0\x80j\x80\xa0\x03\r\x01\x01\xa2\x80d\x80\xa0\xa0\x80b\x80\xa0\x03\x02\x01\xa1\x03\x02\x01\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00)
#不起作用,因为它使用相对OID
试试看
RELATIVE-OID ::= [UNIVERSAL 13] IMPLICIT OCTET STRING