def pack(self): length = get_length(self.val) lengthBytes = self.LENGTH_STRUCT.pack(length) if self.val: return lengthBytes + bytes(self.val) return lengthBytes
def pack(self): length = get_length(self.val) lengthBytes = self.LENGTH_STRUCT.pack(length) if self.val: return lengthBytes + self.val.encode("utf-8") return lengthBytes
def pack(self): buf = BytesIO() buf.write(array_length_struct.pack(get_length(self.val))) payload_size = array_length_struct.size for v in self.val: if not isinstance(v, type_): raise TypeError(f"Incompatible type {v.__class__.__name__}.") buf.write(v.pack()) payload_size += v.size return buf.getvalue()
def unpack(self, data): length = get_length(data) if length < self.LENGTH_STRUCT.size: raise ValueError(f"size too short: {length}.") payload_length = self.LENGTH_STRUCT.unpack(data[: self.LENGTH_STRUCT.size])[0] if length < self.LENGTH_STRUCT.size + payload_length: raise ValueError(f"incomplete field, size too short: {length}.") self.val = bytes( data[self.LENGTH_STRUCT.size : self.LENGTH_STRUCT.size + payload_length] ).decode("utf-8") return self.LENGTH_STRUCT.size + payload_length
def unpack(self, data): data = memoryview(data) length = get_length(data) try: payload_length = self.LENGTH_STRUCT.unpack(data[: self.LENGTH_STRUCT.size])[ 0 ] except struct.error: raise ValueError(f"size too short: {get_length(data)}.") if length < self.LENGTH_STRUCT.size + payload_length: raise ValueError(f"incomplete field, size too short: {length}.") self.val = data[ self.LENGTH_STRUCT.size : self.LENGTH_STRUCT.size + payload_length ].tobytes() return self.LENGTH_STRUCT.size + payload_length
def test_get_length_dict(self): self.assertEqual(get_length({"hello": "world"}), 1)
def test_get_length_tuple(self): self.assertEqual(get_length((1, 2, 3)), 3)
def test_get_length_list(self): self.assertEqual(get_length([]), 0)
def test_get_length_invalid_type(self): with self.assertRaises(ValueError): get_length(object())
def test_get_length_none_type(self): self.assertEqual(get_length(None), 0)
def test_get_length_bytes_io(self): bio = io.BytesIO(b"wlfae;ksddas.fafjew") self.assertEqual(get_length(bio), bio.getbuffer().nbytes)
def test_get_length_str(self): s = "this is frank speaking." self.assertEqual(get_length(s), len(s))
def test_get_length_bytes(self): b = b"qwldkjo;aiealiewfu" self.assertEqual(get_length(b), len(b))
def test_get_length_memoryview(self): mv = memoryview(b"awekf;jawlekfa") self.assertEqual(get_length(mv), mv.nbytes)
def len_(self): return get_length(self.val)
def size(self): return self.LENGTH_STRUCT.size + get_length(self.val)