如何解决不支持RELATIVE-OID的ASN.1库

如何解决如何解决不支持RELATIVE-OID的ASN.1库

我正在尝试使用asn1tools Python库对符合Ember+标准的BER消息进行解码和编码。

That standard’s DTD在某些地方使用ASN.1的RELATIVE-OID类型。但是,asn1tools对此类型一无所知,可能是因为底层的pyasn1库没有实现它(目前还没有a pull request)。这就是为什么我无法在Python程序中使用该DTD的原因。但是我真的必须。

我所看到的,我的选择是创建包含pyasn1公关的RELATIVE-OID的修补版本,并使asn1tools与之一起工作,或者以某种方式建立解决方法在DTD中。

我已经尝试过将RELATIVE-OID ::= [UNIVERSAL 13] OCTET STRING添加到DTD,但是现在asn1tools的回答是Expected RELATIVE-OID with tag '2d' at offset 10,but got '0d'.,基本上它似乎接受了我的定义,但是使它“通用构造为13”消息将其标记为“通用原始 13”。

我有办法解决这个问题吗?

这是我的限制条件:

  • 我基本上已经使用asn1tools,我的代码已经严重依赖于它。
  • 具有能够解析和创建与将这些字段标记0d的其他第三方客户端兼容的消息。
  • 可以在DTD中随意编辑,例如添加定义RELATIVE-OID的类型(但以哪种方式?)或替换每次出现的RELATIVE-OID与其他内容配合使用,只要它仍能与将字段标记0d的消息一起使用。
  • 我完全可以将RELATIVE-OID的值作为bytes或类似内容的不透明斑点,这就是为什么我首先尝试解决OCTET STRING的原因。 / li>

我的ASN.1知识有限,而且我不擅长编写DTD。也许有一种方法可以将类型强制为“原始”类型?我很高兴提出任何建议。如果您想自己尝试一下,请使用上面的DTD链接。然后,使用以下Python代码

import asn1tools

spec = asn1tools.compile_files('GlowDtd.asn1')

print(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'))
# should result in ('elements',[('element',('command',{'number': 32,'options': ('dirFieldMask',-1)}))])

print(spec.decode('Root',b'`\x80k\x80\xa0\x80j\x80\xa0\x03\r\x01\x01\xa2\x80d\x80\xa0\x80b\x80\xa0\x03\x02\x01 \xa1\x03\x02\x01\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'))
# doesn't work because it uses RELATIVE-OID

解决方法

尝试

RELATIVE-OID ::= [UNIVERSAL 13] IMPLICIT OCTET STRING

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?