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 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 testReadVarInt(self): reader = BitStreamReader(b'\x00\x80') self.assertEqual(0, reader.readVarInt()) self.assertEqual(8, reader.getBitPosition()) self.assertEqual(INT64_MIN, reader.readVarInt()) self.assertEqual(16, reader.getBitPosition()) with self.assertRaises(PythonRuntimeException): reader.readVarInt()
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())
def testSetBitPosition(self): reader = BitStreamReader(bytes(1)) reader.setBitPosition(0) self.assertEqual(0, reader.getBitPosition()) reader.setBitPosition(7) self.assertEqual(7, reader.getBitPosition()) reader.setBitPosition(8) self.assertEqual(8, reader.getBitPosition()) with self.assertRaises(PythonRuntimeException): reader.setBitPosition(9) with self.assertRaises(PythonRuntimeException): reader.setBitPosition(-1) reader.setBitPosition(0) self.assertEqual(0, reader.getBitPosition())
def testBitPosition(self): writer = BitStreamWriter() writer.writeBits(0xaaaa, 16) self.assertEqual(16, writer.getBitPosition()) writer.writeBits(0xff, 8) self.assertEqual(24, writer.getBitPosition()) reader = BitStreamReader(buffer=writer.getByteArray()) self.assertEqual(0xaaaa, reader.readBits(16)) self.assertEqual(16, reader.getBitPosition()) reader.setBitPosition(8) self.assertEqual(8, reader.getBitPosition()) self.assertEqual(0xaaff, reader.readBits(16)) reader.setBitPosition(13) self.assertEqual(13, reader.getBitPosition()) self.assertEqual(0x02, reader.readBits(3)) self.assertEqual(16, reader.getBitPosition()) self.assertEqual(0xff, reader.readBits(8)) self.assertEqual(24, reader.getBitPosition()) reader.setBitPosition(0) self.assertEqual(0, reader.getBitPosition()) self.assertEqual(0xaaaaff, reader.readBits(24))
def testReadVarUInt(self): reader = BitStreamReader(bytes(1)) self.assertEqual(0, reader.readVarUInt()) self.assertEqual(8, reader.getBitPosition()) with self.assertRaises(PythonRuntimeException): reader.readVarUInt()
def testGetBitPosition(self): reader = BitStreamReader(bytes(1)) self.assertEqual(0, reader.getBitPosition()) reader.readBits(4) self.assertEqual(4, reader.getBitPosition())
def testReadString(self): reader = BitStreamReader(bytes(b'\x01\x41')) self.assertEqual("A", reader.readString()) self.assertEqual(16, reader.getBitPosition()) with self.assertRaises(PythonRuntimeException): reader.readString()
def testReadFloat64(self): reader = BitStreamReader(bytes(8)) self.assertEqual(0.0, reader.readFloat64()) self.assertEqual(64, reader.getBitPosition()) with self.assertRaises(PythonRuntimeException): reader.readFloat64()