Skip to content

Instantly share code, notes, and snippets.

@NWPlayer123
Last active December 23, 2017 22:33
Show Gist options
  • Save NWPlayer123/eba6a75fac84bda0d263afc5b8eca755 to your computer and use it in GitHub Desktop.
Save NWPlayer123/eba6a75fac84bda0d263afc5b8eca755 to your computer and use it in GitHub Desktop.
from struct import pack, unpack
from os import remove, rename
import sys
do_replace = 1
with open(sys.argv[1], "rb") as f:
name = sys.argv[1].split(".")
name = ".".join(name[:-1]) + ".dec." + name[-1]
with open(name, "wb+") as o:
header = unpack("<I", f.read(4))[0]
assert header & 0xFF == 0x11 #LZ11
unc_size = header >> 8 #remove 0x11
o.write("\x00" * unc_size) #pre-allocate
o.seek(0);mask = 0
while unc_size != 0:
if not mask: #read new flag byte
mask = 0x80
flag = ord(f.read(1))
if not flag & mask: #0, read one byte
o.write(f.read(1))
unc_size -= 1
else: #1, RLE stuff
byte1 = ord(f.read(1))
length = byte1 >> 4
if length == 0:
byte2 = ord(f.read(1))
byte3 = ord(f.read(1))
size = (((byte1 & 15) << 4) | (byte2 >> 4)) + 0x11
back = (((byte2 & 15) << 8) | byte3) + 1
elif length == 1:
byte2 = ord(f.read(1))
byte3 = ord(f.read(1))
byte4 = ord(f.read(1))
size = (((byte1 & 15) << 12) | (byte2 << 4) | (byte3 >> 4)) + 0x111
back = (((byte3 & 15) << 8) | byte4) + 1
else:
byte2 = ord(f.read(1))
size = (byte1 >> 4) + 1
back = (((byte1 & 15) << 8) | byte2) + 1
unc_size -= size
if size > back: #overlap, cache it
o.seek(back * -1, 1)
buff = list(o.read(size + back))
for i in range(size):
buff[back + i] = buff[i]
o.seek((size + back) * -1, 1)
o.write("".join(buff))
else:
o.seek(back * -1, 1)
data = o.read(size)
o.seek(back - size, 1)
o.write(data)
mask >>= 1
if do_replace:
remove(sys.argv[1])
rename(name, sys.argv[1])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment