用于指定/解析/打包二进制协议的库
suitcase的Python项目详细描述
行李箱
手提箱是一个为 指定和解析协议。手提箱提供内部DSL (领域特定语言)用于描述协议帧。它试图 对于二进制协议,像Django’s ORM和 Sqlalchemy’s Declarative Syntax 用于数据库orms并采用类似的、基于类的语法。
手提箱的原始版本是由 DigiWireless Design Services。这个 软件是作为alpha软件提供的,没有经过正式的 测试,但也有大量的单元测试。
示例
下面的例子展示了如何使用手提箱来描述 构成互联网骨干网的核心网络协议:
fromsuitcase.fieldsimportUBInt16,Payload,LengthField,Magic, \ UBInt8Sequence,DispatchField,DispatchTarget,UBInt8,UBInt32,BitField,BitNum, \ BitBoolfromsuitcase.structureimportStructureclassTCPFrameHeader(Structure):source_address=UBInt16()destination_address=UBInt16()sequence_number=UBInt32()acknowledgement_number=UBInt32()options=BitField(16,data_offset=BitNum(4),reserved=BitNum(3),NS=BitBool(),CWR=BitBool(),ECE=BitBool(),URG=BitBool(),ACK=BitBool(),PSH=BitBool(),RST=BitBool(),SYN=BitBool(),FIN=BitBool())window_size=UBInt16()checksum=UBInt16()urgent_pointer=UBInt16()# TODO: additional options if data_offset > 5classUDPFrame(Structure):source_port=UBInt16()destination_port=UBInt16()length=LengthField(UBInt16())checksum=UBInt16()data=Payload(length)classIPV4Frame(Structure):options=BitField(64,version=BitNum(4),internet_header_length=BitNum(4),differentiated_services_code_point=BitNum(6),explicit_congestion_notification=BitNum(2),total_length=BitNum(16),identification=BitNum(16),flags=BitNum(3),fragment_offset=BitNum(13),)time_to_live=UBInt8()protocol=DispatchField(UBInt8())header_checksum=UBInt16()source_ip_address=UBInt32()destination_ip_address=UBInt32()
从这些声明性定义中,可以创建消息 实例并打包它们或解析字节(包括流解析)以获取 您可以随意使用的对象。
有关更多信息,包括如何使用 请参考Full Documentation中的描述。
设计目标
图书馆力求遵循以下核心原则:
简单的界面
库的接口应该很简单,并且应该有 库api中的逻辑一致性。内部高级语言 使用了一些技术,但是api使用者不需要知道 这些细节。
声明性语法
在适当的情况下,库应设法为 指定尽可能声明性的协议。这些 声明应该明确,并且应该清楚 宣布。
信息性错误消息
在实现一个协议时,通常在 第一次。图书馆应该使用所有可用的信息 向api使用者提供信息,帮助他们找出 容易出问题的地方。
常见用例应该很简单
有些数据类型/模式在 协议。库中应该包含帮助处理这些情况的代码 让程序员的生活更轻松。
不太常见的用例应该是可能的
如果有一个协议与 规范,库仍然应该提供一些有用的代码 重复使用。图书馆的某些部分可能需要废弃,但是 希望人们不必从头开始。
许可证
这个软件是开源软件。Digi International版权所有, 2015年。
此源代码表单受mozilla public条款的约束 执照,2.0版。如果MPL的一个副本没有与此一起分发 文件,您可以在http://mozilla.org/MPL/2.0/获得一个。