TLV对象的Python库
uttlv的Python项目详细描述
TLV Python解析器-版本0.4.0
Tag Length Value(也称为Type Length Value)是一种用于许多协议的编码方案。在
tag和length的大小是固定的(从1到4个字节不等),而value字段的大小是可变的。在
字段包括:
- Tag:表示对象表示的字段类型的字母数字代码
- Length:值字段的大小(以字节为单位)
- Value:变量大小的字节序列,其中包含此字段对象的数据。在
使用TLV的优点:
- 序列通常很容易解析
- 可以跳过或忽略未知的标记或元素,因此可以毫无问题地添加新版本
- 元素可以按任何顺序排列
- 可以在不破坏协议本身或解析功能的情况下创建新元素。在
{a1可查看更多信息}
安装
您可以直接从PyPI安装:
pip install uttlv
或者下载源代码并使用pip安装:
^{pr2}$如何使用
要开始使用这个包,只需导入包并创建一个对象
fromuttlvimportTLV# Create objectt=TLV()
要将标记添加到对象,请像dict值一样执行:
# A tag of int valuet[0x01]=10# A tag of string valuet[0x02]='test'# A tag of an array of bytest[0x03]=bytes([1,2,3])# Or another TLV objectanother_one=TLV()another_one[0x05]=234t[0x04]=another_one
标记只能是int、str、bytes或TLV本身。任何其他类型都将引发TypeError异常。 如果插入了一个标记,并且该对象上已经存在具有相同标记值的另一个对象,则该标记将被新值覆盖。在
要获取底层数组,只需调用to_byte_array()
方法:
arr=t.to_byte_array()print('TLV:',arr)
解析
要解析数组,只需调用方法parse_array()
:
# create objectt=TLV()# parse from objectdata=bytes([0x03,0x00,0x04,0x00,0x00,0x00,0x0A])t.parse_array(data)
漂亮的印花
如果调用tree()
,则对象将创建一个带有tree-like结构的字符串来打印:
fromprtlvimportTLV# Create objectt=TLV()# Add valuet[0x01]=10# Print itprint('Value:\n',t.tree())## <output>## Value: ## 1: 10##
Tag映射
您还可以添加一个字典来将标记映射到它的下划线类类型,这样它就显示为正确的类型 而不是告别。在
dictionary必须将所有键作为标记值,并将其各自的值用作 标签:
config={0x01:{'type':'int','name':'NUM_POINTS'},0x02:{'type':'int','name':'IDLE_PERIOD'},0x03:{'type':'str','name':'NAME'},0x04:{'type':'str','name':'CITY'},0x05:{'type':'bytes','name':'VERSION'},0x06:{'type':'bytes','name':'DATA'},0x07:{'type':'TLV','name':'RELATED'},0x08:{'type':'TLV','name':'COMMENT'}}# Set mapTLV.set_tag_map(config)
目前,只有'int'、'str'、'bytes'和'TLV'被接受为有效类。任何其他职业都会提高 属性错误。在
如果配置了标记映射,则可以使用标记名称访问其值:
t=TLV()t['NUM_POINTS']=10print(t['NUM_POINTS'])
还可以打印所有标记名而不是值:
t.tree(use_names=True)## <output>## NUM_POINTS: 10
您还可以直接访问标记:
t=TLV()t['NUM_POINTS']=10print(t.NUM_POINTS)
待办事项功能
- 同时不同的tag长度
- 项目
标签: