TLV对象的Python库

uttlv的Python项目详细描述


TLV Python解析器-版本0.4.0

Tag Length Value(也称为Type Length Value)是一种用于许多协议的编码方案。在

taglength的大小是固定的(从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

标记只能是intstrbytesTLV本身。任何其他类型都将引发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长度

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
使用Java将JSON转换为哈希映射   java如何通过使用MapStruct从源对象复制值来填充目标对象内部的映射?   注入泛型类型为@InjectGuice的类时发生java错误   字符串如何在JavaIDE中导入基本符号   在Java中将JSON转换为List<List<String>>   java Java9 HttpClient SSLHandshakeException   java jOOQ代码生成器   java如何调整图标(图像按钮),使其不会放大?   java我可以在使用Eclipse时安装2个或更多Android SDK吗   sqlite Java实现DAO   如何解决此错误?“java.lang.NoSuchFieldError:org.apache.http.conn.ssl.SSLConnectionSocketFactory上的实例。<clinit>。”   java Maven:将基于OSP的zip文件解压缩到WEBINF/lib   java如何在每次调用函数时获取当前gps位置?