Exemplo n.º 1
0
    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))
Exemplo n.º 2
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._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))
Exemplo n.º 3
0
 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()
Exemplo n.º 4
0
 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())
Exemplo n.º 5
0
    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())
Exemplo n.º 6
0
    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))
Exemplo n.º 7
0
 def testReadVarUInt(self):
     reader = BitStreamReader(bytes(1))
     self.assertEqual(0, reader.readVarUInt())
     self.assertEqual(8, reader.getBitPosition())
     with self.assertRaises(PythonRuntimeException):
         reader.readVarUInt()
Exemplo n.º 8
0
 def testGetBitPosition(self):
     reader = BitStreamReader(bytes(1))
     self.assertEqual(0, reader.getBitPosition())
     reader.readBits(4)
     self.assertEqual(4, reader.getBitPosition())
Exemplo n.º 9
0
 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()
Exemplo n.º 10
0
 def testReadFloat64(self):
     reader = BitStreamReader(bytes(8))
     self.assertEqual(0.0, reader.readFloat64())
     self.assertEqual(64, reader.getBitPosition())
     with self.assertRaises(PythonRuntimeException):
         reader.readFloat64()