Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何解决ASN.1库不支持相对OID的问题_Python_Asn.1_Pyasn1_Asn1tools - Fatal编程技术网

Python 如何解决ASN.1库不支持相对OID的问题

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

我试图使用Python库对符合标准的BER消息进行解码和编码

在某些地方使用ASN.1的
相对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字符串
    解决方法
我的ASN.1知识有限,我不擅长编写DTD。也许有一种方法可以将类型强制为“原始”类型?我很乐意接受任何建议。如果您想自己尝试,请使用上面链接的DTD。然后,使用以下Python代码:

导入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