Esempio n. 1
0
    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))
Esempio n. 2
0
    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))
Esempio n. 3
0
 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)