Advertisement
Guest User

miscjj1.py

a guest
Jun 21st, 2010
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.32 KB | None | 0 0
  1. import struct
  2. import os
  3. import math
  4. from array import array
  5.  
  6. def rle_decompress(data):
  7.     ''' function to take some data compressed in
  8.        Jazz Jackrabbit 1's Run Length Encoding
  9.        encryption, decompress it, and return the result'''
  10.     offset = 0
  11.     ret = []
  12.     while offset < len(data):
  13.         byte = struct.unpack("B", data[offset])[0]
  14.         if byte > 127:
  15.             for i in range(0, byte - 128):
  16.                 ret.append(struct.unpack("B", data[offset+1])[0])
  17.             offset += 2
  18.         elif byte >= 1:
  19.             for i in range(1, byte+1):
  20.                 ret.append(struct.unpack("B", data[offset+i])[0])
  21.             offset += byte+1
  22.         else:
  23.             ret.append(struct.unpack("B", data[offset+1])[0])
  24.             break
  25.            
  26.     return ret
  27.  
  28. class Jazzfile:
  29.     '''A file containing naught but uncompressed and RLE-compressed blocks'''
  30.     blocklengths = None
  31.  
  32.     def __init__(self, filename):
  33.         ''' loads file contents into memory '''
  34.         try:
  35.             self.filecontents = open(filename, "rb")
  36.         except:
  37.             print("file %s could not be read!" % filename)
  38.             os._exit(0)
  39.            
  40.         self.filesize = os.path.getsize(filename)
  41.         self.filecontents = self.filecontents.read(self.filesize)
  42.  
  43.     def discover_blocklengths(self):
  44.         self.blocklengths = array('i')
  45.         for i in range(len(self.uncompresseds)-1):
  46.             if self.uncompresseds[i]:
  47.                 self.blocklengths.append(self.uncompresseds[i])
  48.             else:
  49.                 offset = sum(self.blocklengths) + len(self.blocklengths)
  50.                 self.blocklengths.append(struct.unpack("H", self.filecontents[offset:][:2])[0]+1)
  51.         offset = sum(self.blocklengths) + len(self.blocklengths)
  52.         self.blocklengths.append(len(self.filecontents[offset:]))
  53.  
  54.     def get_block_offset(self, blockid):
  55.         if not self.blocklengths:
  56.             self.discover_blocklengths()
  57.         return sum(self.blocklengths[:blockid]) + len(self.blocklengths[:blockid])
  58.  
  59.     def get_block(self, blockid):
  60.         offset = self.get_block_offset(blockid)
  61.         if self.uncompresseds[blockid]:
  62.             return self.filecontents[offset:offset+self.blocklengths[blockid]]
  63.         else:
  64.             return rle_decompress(self.filecontents[offset+2:])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement