ASN.1类型和编解码器
项目描述
Python的ASN.1库
这是一个免费且开源的Python包,实现了ASN.1类型和编解码器。它最初是为了支持特定的协议(SNMP)而编写的,但后来被推广到适用于基于ASN.1规范的广泛协议。
该项目已被分叉用于持续维护和现代化。
特性
- ASN.1类型(X.208)的通用实现
- 符合标准的BER/CER/DER编解码器
- 可以操作序列化数据的流
- 从Python类型导入/导出ASN.1结构
- 100% Python,支持Python 2.7和3.5+
- MT安全
- 贡献ASN.1编译器 Asn1ate
为什么使用pyasn1
ASN.1解决了数据序列化问题。这个解决方案是古代的智者们很久以前设计的。当时,他们没有浪费位的奢侈。这就是为什么ASN.1被设计成将无界复杂性的数据结构序列化成紧凑高效的形式,以便在处理数据时使用。
这可能解释了为什么许多网络协议和文件格式仍然依赖于这个30多年的老技术。包括许多高调的互联网协议和文件格式。
许多书籍都涵盖了ASN.1的主题。Olivier Dubuisson的《异构系统之间的通信》是其中一本免费在互联网上提供的优质书籍。
pyasn1包旨在帮助Python程序员在网络协议和文件格式方面使用Python提示符进行操作。这个工具努力捕捉一个相当复杂的ASN.1系统的所有方面,并在Python术语中对其进行表示。
如何使用pyasn1
使用pyasn1,您可以从ASN.1数据结构构建Python对象。例如,以下ASN.1数据结构
Record ::= SEQUENCE {
id INTEGER,
room [0] INTEGER OPTIONAL,
house [1] INTEGER DEFAULT 0
}
可以像这样在pyasn1中表示
class Record(Sequence):
componentType = NamedTypes(
NamedType('id', Integer()),
OptionalNamedType(
'room', Integer().subtype(
implicitTag=Tag(tagClassContext, tagFormatSimple, 0)
)
),
DefaultedNamedType(
'house', Integer(0).subtype(
implicitTag=Tag(tagClassContext, tagFormatSimple, 1)
)
)
)
ASN.1的精神是将抽象数据描述转换为特定编程语言的形式。一旦您将ASN.1数据结构用Python表示出来,您就可以像使用类似Python类型(例如,ASN.1 SET
类似于Python dict
,SET OF
类似于list
)一样使用它。
>>> record = Record()
>>> record['id'] = 123
>>> record['room'] = 321
>>> str(record)
Record:
id=123
room=321
>>>
ASN.1的力量部分来自于其序列化特性。您可以序列化您的数据结构并将其通过网络发送。
>>> from pyasn1.codec.der.encoder import encode
>>> substrate = encode(record)
>>> hexdump(substrate)
00000: 30 07 02 01 7B 80 02 01 41
相反,您可以将从网络接收到的序列化ASN.1内容,或从文件中读取的内容,转换为Python对象,您可以对其进行检查、修改、编码并发送回去。
>>> from pyasn1.codec.der.decoder import decode
>>> received_record, rest_of_substrate = decode(substrate, asn1Spec=Record())
>>>
>>> for field in received_record:
>>> print('{} is {}'.format(field, received_record[field]))
id is 123
room is 321
house is 0
>>>
>>> record == received_record
True
>>> received_record.update(room=123)
>>> substrate = encode(received_record)
>>> hexdump(substrate)
00000: 30 06 02 01 7B 80 01 7B
pyasn1类努力模拟它们的Python原型(例如int、list、dict等)。但是ASN.1类型表现出更复杂的行为。为了使Pythonista的生活更加轻松,他们可以将他们的pyasn1类转换为Python内置类型。
>>> from pyasn1.codec.native.encoder import encode
>>> encode(record)
{'id': 123, 'room': 321, 'house': 0}
或者反过来——您可以从Python对象树初始化ASN.1结构
>>> from pyasn1.codec.native.decoder import decode
>>> record = decode({'id': 123, 'room': 321, 'house': 0}, asn1Spec=Record())
>>> str(record)
Record:
id=123
room=321
>>>
在ASN.1设计中,序列化编解码器与数据对象解耦,因此您可以将其转换为多种不同的序列化形式。截至目前,pyasn1支持BER、DER、CER和Python内置编解码器。极紧凑的PER编码预计将在即将发布的pyasn1版本中引入。
有关pyasn1 API的更多信息,请参阅文档,不同协议和文件格式的编译ASN.1模块可以在pyasn1-modules 存储库中找到。
如何获取pyasn1
该项目是从pyasn1分叉的。pyasn1包在2条款BSD 许可证的条款和条件下分发。源代码以GitHub 存储库的形式免费提供。
您可以使用pip install pysnmp-pyasn1
或从PyPI下载它。
如果某些功能没有按预期工作,请在GitHub上打开一个问题,或在Stack Overflow上发布您的问题或尝试浏览pyasn1。
版权(c)2005-2020,Ilya Etingof。保留所有权利。版权(c)2021- [Splunk Inc.]
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。