gck-map-extract-objects/lib/fileutils.py

73 lines
1.6 KiB
Python

import struct
def read_int(fp):
return struct.unpack("<L", fp.read(4))[0]
def read_byte(fp):
return struct.unpack("<B", fp.read(1))[0]
def read_float(fp):
return struct.unpack("<f", fp.read(4))[0]
def read_short(fp):
return struct.unpack("<H", fp.read(2))[0]
def read_string(fp, size):
return read_bytes(fp, size).decode("utf8").replace("\x00", "")
def read_bytes(fp, size):
return bytes(struct.unpack('<' + str(size) + 'B', fp.read(size)))
def read_string_until_none(fp) -> str:
s = ""
c = read_byte(fp)
while c != 0x00:
s += chr(c)
c = read_byte(fp)
return s
def decompress(compressed_bytes, original_size: int):
i = 0
j = 0
dec_byte = 0
dec_bits = 8
buff_start = 0xFEE
res = bytearray(original_size)
if original_size == 0:
return res
while j < original_size:
if dec_bits == 8:
dec_byte = compressed_bytes[i]
i += 1
dec_bits = 0
if (dec_byte >> dec_bits & 1) == 0:
dec_pos = ((compressed_bytes[i] + (
(compressed_bytes[i + 1] & 0xF0) << 4) - buff_start - j) & 0xFFF) - 0x1000 + j
dec_len = (compressed_bytes[i + 1] & 0xF) + 3
i += 2
while dec_len > 0:
if dec_pos >= 0:
res[j] = res[dec_pos]
else:
res[j] = 32
j += 1
dec_pos += 1
dec_len -= 1
else:
res[j] = compressed_bytes[i]
i += 1
j += 1
dec_bits += 1
return res