Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/compression.py b/compression.py
- index f1fd794..c1f4bef 100644
- --- a/compression.py
- +++ b/compression.py
- @@ -2,12 +2,111 @@ import os, hashlib, struct, subprocess, fnmatch, shutil, urllib, array
- import wx
- import png
- +import zlib
- from Crypto.Cipher import AES
- from Struct import Struct
- from common import *
- +class CCF():
- + class CCFHeader(Struct):
- + __endian__ = Struct.LE
- + def __format__(self):
- + self.magic = Struct.string(4)
- + self.zeroes12 = Struct.string(12)
- + self.rootOffset = Struct.uint32
- + self.filesCount = Struct.uint32
- + self.zeroes8 = Struct.string(8)
- +
- + class CCFFile(Struct):
- + __endian__ = Struct.LE
- + def __format__(self):
- + self.fileName = Struct.string(20)
- + self.fileOffset = Struct.uint32
- + self.fileSize = Struct.uint32
- + self.fileSizeDecompressed = Struct.uint32
- + def __init__(self, fileName):
- + self.fd = open(fileName, 'r+')
- +
- + def compress(self, folder):
- + fileHdr = self.CCFHeader()
- +
- + files = os.listdir(folder)
- +
- + fileHdr.magic = "\x43\x43\x46\x00"
- + fileHdr.zeroes12 = '\x00' * 12
- + fileHdr.rootOffset = 0x20
- + fileHdr.filesCount = len(files)
- + fileHdr.zeroes8 = '\x00' * 8
- +
- + self.fd.write(fileHdr.pack())
- +
- + currentOffset = len(fileHdr)
- + packedFiles = 0
- +
- + for file in files:
- + packedFiles += 1
- +
- + fileEntry = self.CCFFile()
- +
- + compressedBuffer = zlib.compress(open(folder + '/' + file).read())
- +
- + fileEntry.fileName = file
- + fileEntry.fileSize = len(compressedBuffer)
- + fileEntry.fileSizeDecompressed = os.stat(folder + '/' + file).st_size
- + fileEntry.fileOffset = len(fileHdr) + (len(files) * packedFiles) + fileEntry.fileSize
- +
- + print 'File {0} ({1}Kb) placed at offset 0x{2:X}'.format(fileEntry.fileName, fileEntry.fileSize, fileEntry.fileOffset)
- +
- + self.fd.seek(currentOffset)
- + self.fd.write(fileEntry.pack())
- + self.fd.seek(fileEntry.fileOffset)
- + self.fd.write(compressedBuffer)
- +
- + currentOffset += len(fileEntry)
- +
- + self.fd.close()
- +
- +
- +
- + def decompress(self):
- + fileHdr = self.CCFHeader()
- + hdrData = self.fd.read(len(fileHdr))
- + fileHdr.unpack(hdrData)
- +
- + print 'Found {0} files and root node at 0x{1:X}'.format(fileHdr.filesCount, fileHdr.rootOffset)
- +
- + if fileHdr.magic != "\x43\x43\x46\x00":
- + raise ValueError("Wrong magic, 0x{0:X}".format(fileHdr.magic))
- +
- + currentOffset = len(fileHdr)
- +
- + for x in range(fileHdr.filesCount):
- + self.fd.seek(currentOffset)
- +
- + fileEntry = self.CCFFile()
- + fileData = self.fd.read(currentOffset + len(fileEntry))
- + fileEntry.unpack(fileData)
- +
- + fileEntry.fileOffset = fileEntry.fileOffset * 32
- +
- + print 'File {0} at offset 0x{1:X}'.format(fileEntry.fileName, fileEntry.fileOffset)
- + print 'File size {0}Kb ({1}Kb decompressed)'.format(fileEntry.fileSize / 1024, fileEntry.fileSizeDecompressed / 1024)
- +
- + output = open(fileEntry.fileName.rstrip('\0'), 'wb')
- +
- + self.fd.seek(fileEntry.fileOffset)
- + if fileEntry.fileSize == fileEntry.fileSizeDecompressed:
- + output.write(self.fd.read(fileEntry.fileSize))
- + else:
- + decompressedBuffer = zlib.decompress(self.fd.read(fileEntry.fileSize))
- + output.write(decompressedBuffer)
- + output.close()
- +
- + currentOffset += len(fileEntry)
- +
- +
- class LZ77():
- class WiiLZ77: #class by marcan
- TYPE_LZ77 = 1
Add Comment
Please, Sign In to add comment