Write format codes into list instead of string. Fixes #12.

This commit is contained in:
Markus Birth 2021-03-25 00:23:04 +01:00
parent fc6ce4ed93
commit bef90b2082
Signed by: mbirth
GPG Key ID: A9928D7A098C3A9A

View File

@ -232,13 +232,13 @@ class TLV6(TLV):
def __init__(self, type_id: int, expected_length: int, value=None, offset: int=None): def __init__(self, type_id: int, expected_length: int, value=None, offset: int=None):
super().__init__(type_id, expected_length, value, offset) super().__init__(type_id, expected_length, value, offset)
self.fids = [] self.fids = []
self.format = "" self.format = []
self.fields = [] self.fields = []
def add_fid(self, fid: int): def add_fid(self, fid: int):
fdef = self.FIELD_TYPES[fid] fdef = self.FIELD_TYPES[fid]
self.fids.append(fid) self.fids.append(fid)
self.format += fdef[0] self.format.append(fdef[0])
self.fields.append(fdef[1]) self.fields.append(fdef[1])
def parse(self): def parse(self):
@ -249,7 +249,7 @@ class TLV6(TLV):
raise Exception(RED + "Invalid TLV6 payload length!" + RESET) raise Exception(RED + "Invalid TLV6 payload length!" + RESET)
self.fids = [] self.fids = []
self.format = "" self.format = []
self.fields = [] self.fields = []
for i in range(0, len(self.value), 2): for i in range(0, len(self.value), 2):
fid = unpack("<H", self.value[i:i+2])[0] fid = unpack("<H", self.value[i:i+2])[0]
@ -304,7 +304,7 @@ class TLV7(TLV):
#print("Got {} Bytes.".format(len(self.value))) #print("Got {} Bytes.".format(len(self.value)))
#print("Format: {}".format(self.tlv6.format)) #print("Format: {}".format(self.tlv6.format))
#print(repr(self.value)) #print(repr(self.value))
values = unpack("<" + self.tlv6.format, self.value) values = unpack("<" + "".join(self.tlv6.format), self.value)
for i, v in enumerate(values): for i, v in enumerate(values):
fid = self.tlv6.fids[i] fid = self.tlv6.fids[i]
self.attr.append((fid, v)) self.attr.append((fid, v))
@ -331,7 +331,7 @@ class TLV7(TLV):
def set_binary_length(self, new_length): def set_binary_length(self, new_length):
self.tlv6.parse() self.tlv6.parse()
values = unpack("<" + self.tlv6.format, self.value) values = unpack("<" + "".join(self.tlv6.format), self.value)
new_values = [] new_values = []
for i, v in enumerate(values): for i, v in enumerate(values):
fid = self.tlv6.fids[i] fid = self.tlv6.fids[i]
@ -339,7 +339,7 @@ class TLV7(TLV):
new_values.append(new_length) new_values.append(new_length)
else: else:
new_values.append(v) new_values.append(v)
self.value = pack("<" + self.tlv6.format, *new_values) self.value = pack("<" + "".join(self.tlv6.format), *new_values)
self.is_parsed = False self.is_parsed = False
def dump(self): def dump(self):
@ -359,7 +359,7 @@ class TLV7(TLV):
if not self.tlv6.is_parsed: if not self.tlv6.is_parsed:
# Make sure we have the structure analysed (need format attr) # Make sure we have the structure analysed (need format attr)
self.tlv6.parse() self.tlv6.parse()
self.value = pack("<" + self.tlv6.format, *new_values) self.value = pack("<" + "".join(self.tlv6.format), *new_values)
self.length = len(self.value) self.length = len(self.value)
class TLVbinary(TLV): class TLVbinary(TLV):