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
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
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