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._rawArray.clear() if self._isImplicit: if not self._arrayTraits.HAS_BITSIZEOF_CONSTANT: raise PythonRuntimeException("Array: Implicit array elements must have constant bit size!") elementSize = self._arrayTraits.bitSizeOf() remainingBits = reader.getBufferBitSize() - reader.getBitPosition() readSize = remainingBits // elementSize for index in range(readSize): self._rawArray.append(self._arrayTraits.read(reader, index)) else: if self._isAuto: readSize = reader.readVarSize() else: readSize = size for index in range(readSize): if self._checkOffsetMethod is not None: reader.alignTo(8) self._checkOffsetMethod(index, reader.getBitPosition()) self._rawArray.append(self._arrayTraits.read(reader, index))
def testAlignTo(self): writer = BitStreamWriter() writer.writeBits(5, 3) writer.alignTo(8) self.assertEqual(8, writer.getBitPosition()) writer.writeBits(0, 1) writer.alignTo(16) self.assertEqual(16, writer.getBitPosition()) writer.writeBits(0xaa, 9) writer.alignTo(32) self.assertEqual(32, writer.getBitPosition()) writer.writeBits(0xaca, 13) writer.alignTo(64) self.assertEqual(64, writer.getBitPosition()) writer.writeBits(0xcafe, 16) reader = BitStreamReader(buffer=writer.getByteArray()) self.assertEqual(5, reader.readBits(3)) reader.alignTo(8) self.assertEqual(8, reader.getBitPosition()) self.assertEqual(0, reader.readBits(1)) reader.alignTo(16) self.assertEqual(16, reader.getBitPosition()) self.assertEqual(0xaa, reader.readBits(9)) reader.alignTo(32) self.assertEqual(32, reader.getBitPosition()) self.assertEqual(0xaca, reader.readBits(13)) reader.alignTo(64) self.assertEqual(64, reader.getBitPosition()) self.assertEqual(0xcafe, reader.readBits(16))
def testAlignTo(self): reader = BitStreamReader(bytes(1)) reader.alignTo(1) self.assertEqual(0, reader.getBitPosition()) reader.readBits(1) self.assertEqual(1, reader.getBitPosition()) reader.alignTo(1) self.assertEqual(1, reader.getBitPosition()) reader.alignTo(4) self.assertEqual(4, reader.getBitPosition())