Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import struct
- import os
- import math
- from array import array
- def rle_decompress(data):
- ''' function to take some data compressed in
- Jazz Jackrabbit 1's Run Length Encoding
- encryption, decompress it, and return the result'''
- offset = 0
- ret = []
- while offset < len(data):
- byte = struct.unpack("B", data[offset])[0]
- if byte > 127:
- for i in range(0, byte - 128):
- ret.append(struct.unpack("B", data[offset+1])[0])
- offset += 2
- elif byte >= 1:
- for i in range(1, byte+1):
- ret.append(struct.unpack("B", data[offset+i])[0])
- offset += byte+1
- else:
- ret.append(struct.unpack("B", data[offset+1])[0])
- break
- return ret
- class Jazzfile:
- '''A file containing naught but uncompressed and RLE-compressed blocks'''
- blocklengths = None
- def __init__(self, filename):
- ''' loads file contents into memory '''
- try:
- self.filecontents = open(filename, "rb")
- except:
- print("file %s could not be read!" % filename)
- os._exit(0)
- self.filesize = os.path.getsize(filename)
- self.filecontents = self.filecontents.read(self.filesize)
- def discover_blocklengths(self):
- self.blocklengths = array('i')
- for i in range(len(self.uncompresseds)-1):
- if self.uncompresseds[i]:
- self.blocklengths.append(self.uncompresseds[i])
- else:
- offset = sum(self.blocklengths) + len(self.blocklengths)
- self.blocklengths.append(struct.unpack("H", self.filecontents[offset:][:2])[0]+1)
- offset = sum(self.blocklengths) + len(self.blocklengths)
- self.blocklengths.append(len(self.filecontents[offset:]))
- def get_block_offset(self, blockid):
- if not self.blocklengths:
- self.discover_blocklengths()
- return sum(self.blocklengths[:blockid]) + len(self.blocklengths[:blockid])
- def get_block(self, blockid):
- offset = self.get_block_offset(blockid)
- if self.uncompresseds[blockid]:
- return self.filecontents[offset:offset+self.blocklengths[blockid]]
- else:
- return rle_decompress(self.filecontents[offset+2:])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement