import struct
[docs]def decode_list(data):
items = []
while True:
length, = struct.unpack('<H', data[0:2])
item = data[2:2 + length]
data = data[2 + length:]
if length == 0:
break
items.append(item)
return items, data
[docs]def encode_list(lst):
data = bytes()
for item in lst:
data += struct.pack('<H', len(item))
data += item
data += struct.pack('<H', 0) # zero termination
return data
[docs]def decode_dictionary(data, keyfmt='<B'):
keylen = struct.Struct(keyfmt).size
dictionary = {}
items, data = decode_list(data)
for item in items:
if len(item) < keylen:
msg = f'Invalid binary dictionary. Entry must be at least {keylen} bytes long.'
raise ValueError(msg)
key, = struct.unpack(keyfmt, item[0:keylen])
dictionary[key] = item[keylen:]
return dictionary, data
[docs]def encode_dictionary(dictionary, keyfmt='<B'):
items = []
for key, value in dictionary.items():
items.append(struct.pack(keyfmt, key) + value)
return encode_list(items)