64 lines
1.4 KiB
Python
64 lines
1.4 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 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
|