Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def decompress(bytes,of=0):
- decompressed = []
- Offset = of
- outpos = 0
- eod = False
- while not eod and Offset < len(bytes):
- cmd = bytes[Offset]
- if ((cmd & 0x80) == 0):
- # 0xxxxxxx = Copy (X + 1) bytes from input to output
- length = (cmd & 0x7F) + 1;
- for i in range(0,length):
- decompressed.append(bytes[Offset + 1 + i])
- Offset += length + 1;
- else:
- if ((cmd & 0x40) == 0):
- # 10xxxxyy yyyyyyyy = Copy (X + 2) bytes from (output - Y)
- length = ((cmd >> 2) & 0xF) + 2;
- outpos = len(decompressed) - (((cmd & 0x3) << 8) | bytes[Offset + 1])
- for i in range(0,length):
- decompressed.append(decompressed[outpos + i])
- Offset += 2;
- elif ((cmd & 0x20) == 0):
- # 110xxxxx xyyyyyyy yyyyyyyy = Copy (X + 2) bytes from (output - Y)
- length = (((cmd & 0x1F) << 1) | (bytes[Offset + 1] >> 7)) + 2;
- outpos = len(decompressed) - (((bytes[Offset + 1] & 0x7F) << 8) | bytes[Offset + 2])
- for i in range(0,length):
- decompressed.append(decompressed[outpos + i])
- Offset += 3;
- elif ((cmd & 0x10) == 0):
- # 1110xxxx xxxxxxxx yyyyyyyy = Write Y to output (X + 3) times
- length = (((cmd & 0xF) << 8) | bytes[Offset + 1]) + 3;
- for i in range(0,length):
- decompressed.append(bytes[Offset + 2])
- Offset += 3;
- elif ((cmd & 0x08) == 0):
- # 11110xxx yyyyyyyy = Write Y to output (X + 3) times
- length = (cmd & 0x7) + 3;
- for i in range(0,length):
- decompressed.append(bytes[Offset + 1])
- Offset += 2;
- elif ((cmd & 0xFF) == 0xFF):
- print "End of decompress: ",Offset
- return decompressed
- else:
- print "Not Compressed."
- return []
- eod = ((cmd & 0xF8) == 0xF8) | ((cmd & 0xFF) == 0xFF)
- print "End of decompress: ",Offset
- return decompressed
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement