def read(self, reader: BitStreamReader, size: int = 0) -> None: """ Reads array from the bit stream. :param reader: Bit stream from which to read. :param size: Number of elements to read or None in case of implicit or auto arrays. :raises PythonRuntimeException: If the array does not have elements with constant bit size. """ self._raw_array.clear() if self._is_implicit: if not self._array_traits.HAS_BITSIZEOF_CONSTANT: raise PythonRuntimeException( "Array: Implicit array elements must have constant bit size!" ) element_size = self._array_traits.bitsizeof() remaining_bits = reader.buffer_bitsize - reader.bitposition read_size = remaining_bits // element_size for index in range(read_size): self._raw_array.append(self._array_traits.read(reader, index)) else: if self._is_auto: read_size = reader.read_varsize() else: read_size = size for index in range(read_size): if self._check_offset_method is not None: reader.alignto(8) self._check_offset_method(index, reader.bitposition) self._raw_array.append(self._array_traits.read(reader, index))
def test_alignto(self): writer = BitStreamWriter() writer.write_bits(5, 3) writer.alignto(8) self.assertEqual(8, writer.bitposition) writer.write_bits(0, 1) writer.alignto(16) self.assertEqual(16, writer.bitposition) writer.write_bits(0xaa, 9) writer.alignto(32) self.assertEqual(32, writer.bitposition) writer.write_bits(0xaca, 13) writer.alignto(64) self.assertEqual(64, writer.bitposition) writer.write_bits(0xcafe, 16) reader = BitStreamReader(buffer=writer.byte_array) self.assertEqual(5, reader.read_bits(3)) reader.alignto(8) self.assertEqual(8, reader.bitposition) self.assertEqual(0, reader.read_bits(1)) reader.alignto(16) self.assertEqual(16, reader.bitposition) self.assertEqual(0xaa, reader.read_bits(9)) reader.alignto(32) self.assertEqual(32, reader.bitposition) self.assertEqual(0xaca, reader.read_bits(13)) reader.alignto(64) self.assertEqual(64, reader.bitposition) self.assertEqual(0xcafe, reader.read_bits(16))
def test_alignto(self): reader = BitStreamReader(bytes(1)) reader.alignto(1) self.assertEqual(0, reader.bitposition) reader.read_bits(1) self.assertEqual(1, reader.bitposition) reader.alignto(1) self.assertEqual(1, reader.bitposition) reader.alignto(4) self.assertEqual(4, reader.bitposition)