def test_read_unaligned_data(self): # number expected to read at offset test_value = 123 for offset in range(65): buffer = bytearray((8 + offset + 7) // 8) # write test value at offset to data buffer buffer[offset // 8] = test_value >> (offset % 8) if offset % 8 != 0: # don't write behind the buffer buffer[offset // 8 + 1] = 0xff & test_value << (8 - offset % 8) bitbuffer = BitBuffer(buffer, 8 + offset) reader = BitStreamReader.from_bitbuffer(bitbuffer) # read offset bits self.assertEqual(0, reader.read_bits(offset)) # read magic number self.assertEqual(test_value, reader.read_bits(8), msg=("Offset: " + str(offset))) # check eof with self.assertRaises(PythonRuntimeException): reader.read_bits(1)
def test_from_bitbuffer(self): bitbuffer = BitBuffer(bytes([0xAE, 0xEA, 0x80]), 17) reader = BitStreamReader.from_bitbuffer(bitbuffer) self.assertEqual(bitbuffer.bitsize, reader.buffer_bitsize) self.assertEqual(0xAEE, reader.read_bits(12)) self.assertEqual(0x0A, reader.read_bits(4)) self.assertEqual(0x01, reader.read_bits(1)) with self.assertRaises(PythonRuntimeException): reader.read_bits(1)
def deserialize(obj_class: typing.Type[typing.Any], bitbuffer: BitBuffer, *args) -> typing.Any: """ Deserializes bit buffer to the generated object. :param obj_class: Class instance of the generated object to deserialize. :param bitbuffer: Bit buffer which represents generated object in binary format. :param args: Additional arguments needed for obj_class.from_reader method. :returns: Generated object created from given bit buffer. :raises PythonRuntimeException: Throws in case of any error during deserialization. """ reader = BitStreamReader.from_bitbuffer(bitbuffer) return obj_class.from_reader(reader, *args)
def test_from_bitbuffer_overflow(self): bitbuffer = BitBuffer(bytes([0xFF, 0xFF, 0xF0]), 19) reader = BitStreamReader.from_bitbuffer(bitbuffer) self.assertEqual(bitbuffer.bitsize, reader.buffer_bitsize) with self.assertRaises(PythonRuntimeException): reader.read_bits(20)