Package: uttlv
TLV Python Parser - Version 0.7.0ATag-Length-Value(also known asType-Length-Value) is an encoding scheme used for many protocols.Thetagis fixed in size (can be set from 1 to 4 bytes).
Thelengthis automatically determined by how many bytes it would take to represent the size of thevalueby default,
but could be set to a fixed size (from 1 to 4 bytes). Thevaluefield is of variable size.The fields are:Tag: An alphanumeric code that represents the kind of field the object represents;Length: Size of the value field (in bytes);Value: Variable-sized series of bytes which contains data for this field object.Advantages of using TLV:Sequences are usually easy to parse;Unknown tags or elements can be skipped or ignored, so new versions can be added without a problem;Elements can be placed in any order;New elements can be created without breaking the protocol itself or the parsing function.For more information, you can see:https://en.wikipedia.org/wiki/Type-length-valueInstallationYou can install directly from PyPI:pip install uttlvOr download the source code and install using pip:pip install .How to useTo start using this package, just import the package and create an objectfromuttlvimportTLV# Create objectt=TLV()To add a tag to object, do it like a dict value:# 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_oneA tag can only beint,str,bytesor aTLVitself. Any other type will raise aTypeErrorexception.
If a tag is inserted and another object with same tag value already exists on the object, the tag will be overriden with the new value.To get the underlying array, just callto_byte_array()method:arr=t.to_byte_array()print('TLV:',arr)ParseTo parse an array, just call the methodparse_array():# create objectt=TLV()# parse from objectdata=bytes([0x03,0x00,0x04,0x00,0x00,0x00,0x0A])t.parse_array(data)Pretty printIf you calltree(), the object will create a string with atree-likestructure to print:fromprtlvimportTLV# Create objectt=TLV()# Add valuet[0x01]=10# Print itprint('Value:\n',t.tree())## <output>## Value:## 1: 10##TagmapYou can also add a dictionary to map a tag to its underline class type, so it's showed as correct type
instead of a bytearray.The dictionary must have all keys as the tag values and its respective values as the class type of the
tag:config={0x01:{TLV.Config.Type:int,TLV.Config.Name:'NUM_POINTS'},0x02:{TLV.Config.Type:int,TLV.Config.Name:'IDLE_PERIOD'},0x03:{TLV.Config.Type:str,TLV.Config.Name:'NAME'},0x04:{TLV.Config.Type:str,TLV.Config.Name:'CITY'},0x05:{TLV.Config.Type:bytes,TLV.Config.Name:'VERSION'},0x06:{TLV.Config.Type:bytes,TLV.Config.Name:'DATA'},0x07:{TLV.Config.Type:TLV,TLV.Config.Name:'RELATED'},0x08:{TLV.Config.Type:TLV,TLV.Config.Name:'COMMENT'},0x09:{TLV.Config.Type:TLV,TLV.Config.Name:'Empty'}}# Set global default mapTLV.set_global_tag_map(config)# Set tag map for a specific instance (this will override the global setting)t=TLV()t.set_local_tag_map(config)For now, only 'int', 'str', 'bytes', 'TLV', and a dictionary are accepted as valid classes. Any other class will raise
AttributeError.If a tag map is configured, one can use the tag name to access its value:t=TLV()t['NUM_POINTS']=10print(t['NUM_POINTS'])Nested tag maps can be configured by replacing the configured type with another configuration dictionary:config={0x01:{TLV.Config.Name:'FIRST_NEST',TLV.Config.Type:{0x01:{TLV.Config.Name:'SECOND_NEST',TLV.Config.Type:{0x01:{TLV.Config.Name:'THIRD_NEST',TLV.Config.Type:int}}}}}}And also can print it with all tag names instead of values:t.tree(use_names=True)## <output>## NUM_POINTS: 10You can access also the tags directly:t=TLV()t['NUM_POINTS']=10print(t.NUM_POINTS)By default, a field defined as type str in the tag map would be encoded or decoded as utf-8. The encoder can be replaced
to use utf16, utf32 or ascii by setting it inuttlv.tlv.ALLOWED_TYPES[str]=uttlv.tlv.encoder.Utf16Encoderoruttlv.tlv.ALLOWED_TYPES[str]=uttlv.tlv.encoder.Utf32Encoderoruttlv.tlv.ALLOWED_TYPES[str]=uttlv.tlv.encoder.AsciiEncoderrespectively.IteratorYou can iterate through the available tags inside a TLV object by usingiter():t=TLV()t.parse_array(bytes(command_data))forcommandint:pass