+ def unpack(self, data, offset, result=None, ntc=False):
+ return self.packer.unpack_from(data, offset)[0], self.packer.size
+
+
+class String(object):
+ def __init__(self):
+ self.name = 'string'
+ self.size = 1
+ self.length_field_packer = BaseTypes('u32')
+
+ def pack(self, list, kwargs=None):
+ if not list:
+ return self.length_field_packer.pack(0) + b""
+ return self.length_field_packer.pack(len(list)) + list.encode('utf8')
+
+ def unpack(self, data, offset=0, result=None, ntc=False):
+ length, length_field_size = self.length_field_packer.unpack(data,
+ offset)
+ if length == 0:
+ return b'', 0
+ p = BaseTypes('u8', length)
+ x, size = p.unpack(data, offset + length_field_size)
+ x2 = x.split(b'\0',1)[0]
+ return (x2.decode('utf8'), size + length_field_size)
+
+
+types = {'u8': BaseTypes('u8'), 'u16': BaseTypes('u16'),
+ 'u32': BaseTypes('u32'), 'i32': BaseTypes('i32'),
+ 'u64': BaseTypes('u64'), 'f64': BaseTypes('f64'),
+ 'bool': BaseTypes('bool'), 'string': String()}