Example #1
0
    def unpack(self, buff):
        block_bits = buff.read(1)[0]
        uses_palette = block_bits > 0

        if uses_palette:
            palette_len = unpack_varint(buff)
            palette = [unpack_varint(buff) for i in range(palette_len)]
        else:  # use global palette
            block_bits = 13

        data_longs = unpack_varint(buff)
        block_data = [struct.unpack('>Q', buff.read(8))[0]
                      for i in range(data_longs)]

        self.fill()
        blocks = self.data
        max_value = (1 << block_bits) - 1
        for i in range(4096):
            start_long = (i * block_bits) // 64
            start_offset = (i * block_bits) % 64
            end_long = ((i + 1) * block_bits - 1) // 64
            if start_long == end_long:
                block = (block_data[start_long] >> start_offset) & max_value
            else:
                end_offset = 64 - start_offset
                block = (block_data[start_long] >> start_offset |
                         block_data[end_long] << end_offset) & max_value

            if uses_palette:  # convert to global palette
                blocks[i] = palette[block]
            else:
                blocks[i] = block
Example #2
0
    def unpack(self, buff):
        block_bits = buff.read(1)[0]
        uses_palette = block_bits > 0

        if uses_palette:
            palette_len = unpack_varint(buff)
            palette = [unpack_varint(buff) for i in range(palette_len)]
        else:  # use global palette
            block_bits = 13

        data_longs = unpack_varint(buff)
        block_data = [
            struct.unpack('>Q', buff.read(8))[0] for i in range(data_longs)
        ]

        self.fill()
        blocks = self.data
        max_value = (1 << block_bits) - 1
        for i in range(4096):
            start_long = (i * block_bits) // 64
            start_offset = (i * block_bits) % 64
            end_long = ((i + 1) * block_bits - 1) // 64
            if start_long == end_long:
                block = (block_data[start_long] >> start_offset) & max_value
            else:
                end_offset = 64 - start_offset
                block = (block_data[start_long] >> start_offset
                         | block_data[end_long] << end_offset) & max_value

            if uses_palette:  # convert to global palette
                blocks[i] = palette[block]
            else:
                blocks[i] = block
Example #3
0
def test_unpack_varint():
    largebuff = datautils.BoundBuffer(b'\x80\x94\xeb\xdc\x03')
    smallbuff = datautils.BoundBuffer(b'\x14')
    assert datautils.unpack_varint(smallbuff) == 20
    assert datautils.unpack_varint(largebuff) == 1000000000