Advertisement
Kafke

Pokemon Puzzle Challenge Decompression

Jul 22nd, 2018
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.74 KB | None | 0 0
  1. def decompress(bytes,of=0):
  2.     decompressed = []
  3.     Offset = of
  4.     outpos = 0
  5.     eod = False
  6.     while not eod and Offset < len(bytes):
  7.         cmd = bytes[Offset]
  8.         if ((cmd & 0x80) == 0):
  9.             # 0xxxxxxx = Copy (X + 1) bytes from input to output
  10.             length = (cmd & 0x7F) + 1;
  11.             for i in range(0,length):
  12.                 decompressed.append(bytes[Offset + 1 + i])
  13.             Offset += length + 1;
  14.         else:
  15.             if ((cmd & 0x40) == 0):
  16.                 # 10xxxxyy yyyyyyyy = Copy (X + 2) bytes from (output - Y)
  17.                 length = ((cmd >> 2) & 0xF) + 2;
  18.                 outpos = len(decompressed) - (((cmd & 0x3) << 8) | bytes[Offset + 1])
  19.                 for i in range(0,length):
  20.                     decompressed.append(decompressed[outpos + i])
  21.                 Offset += 2;
  22.             elif ((cmd & 0x20) == 0):
  23.                 # 110xxxxx xyyyyyyy yyyyyyyy = Copy (X + 2) bytes from (output - Y)
  24.                 length = (((cmd & 0x1F) << 1) | (bytes[Offset + 1] >> 7)) + 2;
  25.                 outpos = len(decompressed) - (((bytes[Offset + 1] & 0x7F) << 8) | bytes[Offset + 2])
  26.                 for i in range(0,length):
  27.                     decompressed.append(decompressed[outpos + i])
  28.                 Offset += 3;
  29.             elif ((cmd & 0x10) == 0):
  30.                 # 1110xxxx xxxxxxxx yyyyyyyy = Write Y to output (X + 3) times
  31.                 length = (((cmd & 0xF) << 8) | bytes[Offset + 1]) + 3;
  32.                 for i in range(0,length):
  33.                     decompressed.append(bytes[Offset + 2])
  34.                 Offset += 3;
  35.             elif ((cmd & 0x08) == 0):
  36.                 # 11110xxx yyyyyyyy = Write Y to output (X + 3) times
  37.                 length = (cmd & 0x7) + 3;
  38.                 for i in range(0,length):
  39.                     decompressed.append(bytes[Offset + 1])
  40.                 Offset += 2;
  41.             elif ((cmd & 0xFF) == 0xFF):
  42.                 print "End of decompress: ",Offset
  43.                 return decompressed
  44.             else:
  45.                 print "Not Compressed."
  46.                 return []
  47.         eod = ((cmd & 0xF8) == 0xF8) | ((cmd & 0xFF) == 0xFF)
  48.     print "End of decompress: ",Offset
  49.     return decompressed
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement