Guest User

Untitled

a guest
Jun 21st, 2018
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.38 KB | None | 0 0
  1. diff --git a/compression.py b/compression.py
  2. index f1fd794..c1f4bef 100644
  3. --- a/compression.py
  4. +++ b/compression.py
  5. @@ -2,12 +2,111 @@ import os, hashlib, struct, subprocess, fnmatch, shutil, urllib, array
  6. import wx
  7. import png
  8.  
  9. +import zlib
  10. from Crypto.Cipher import AES
  11. from Struct import Struct
  12.  
  13. from common import *
  14.  
  15. +class CCF():
  16. + class CCFHeader(Struct):
  17. + __endian__ = Struct.LE
  18. + def __format__(self):
  19. + self.magic = Struct.string(4)
  20. + self.zeroes12 = Struct.string(12)
  21. + self.rootOffset = Struct.uint32
  22. + self.filesCount = Struct.uint32
  23. + self.zeroes8 = Struct.string(8)
  24. +
  25. + class CCFFile(Struct):
  26. + __endian__ = Struct.LE
  27. + def __format__(self):
  28. + self.fileName = Struct.string(20)
  29. + self.fileOffset = Struct.uint32
  30. + self.fileSize = Struct.uint32
  31. + self.fileSizeDecompressed = Struct.uint32
  32.  
  33. + def __init__(self, fileName):
  34. + self.fd = open(fileName, 'r+')
  35. +
  36. + def compress(self, folder):
  37. + fileHdr = self.CCFHeader()
  38. +
  39. + files = os.listdir(folder)
  40. +
  41. + fileHdr.magic = "\x43\x43\x46\x00"
  42. + fileHdr.zeroes12 = '\x00' * 12
  43. + fileHdr.rootOffset = 0x20
  44. + fileHdr.filesCount = len(files)
  45. + fileHdr.zeroes8 = '\x00' * 8
  46. +
  47. + self.fd.write(fileHdr.pack())
  48. +
  49. + currentOffset = len(fileHdr)
  50. + packedFiles = 0
  51. +
  52. + for file in files:
  53. + packedFiles += 1
  54. +
  55. + fileEntry = self.CCFFile()
  56. +
  57. + compressedBuffer = zlib.compress(open(folder + '/' + file).read())
  58. +
  59. + fileEntry.fileName = file
  60. + fileEntry.fileSize = len(compressedBuffer)
  61. + fileEntry.fileSizeDecompressed = os.stat(folder + '/' + file).st_size
  62. + fileEntry.fileOffset = len(fileHdr) + (len(files) * packedFiles) + fileEntry.fileSize
  63. +
  64. + print 'File {0} ({1}Kb) placed at offset 0x{2:X}'.format(fileEntry.fileName, fileEntry.fileSize, fileEntry.fileOffset)
  65. +
  66. + self.fd.seek(currentOffset)
  67. + self.fd.write(fileEntry.pack())
  68. + self.fd.seek(fileEntry.fileOffset)
  69. + self.fd.write(compressedBuffer)
  70. +
  71. + currentOffset += len(fileEntry)
  72. +
  73. + self.fd.close()
  74. +
  75. +
  76. +
  77. + def decompress(self):
  78. + fileHdr = self.CCFHeader()
  79. + hdrData = self.fd.read(len(fileHdr))
  80. + fileHdr.unpack(hdrData)
  81. +
  82. + print 'Found {0} files and root node at 0x{1:X}'.format(fileHdr.filesCount, fileHdr.rootOffset)
  83. +
  84. + if fileHdr.magic != "\x43\x43\x46\x00":
  85. + raise ValueError("Wrong magic, 0x{0:X}".format(fileHdr.magic))
  86. +
  87. + currentOffset = len(fileHdr)
  88. +
  89. + for x in range(fileHdr.filesCount):
  90. + self.fd.seek(currentOffset)
  91. +
  92. + fileEntry = self.CCFFile()
  93. + fileData = self.fd.read(currentOffset + len(fileEntry))
  94. + fileEntry.unpack(fileData)
  95. +
  96. + fileEntry.fileOffset = fileEntry.fileOffset * 32
  97. +
  98. + print 'File {0} at offset 0x{1:X}'.format(fileEntry.fileName, fileEntry.fileOffset)
  99. + print 'File size {0}Kb ({1}Kb decompressed)'.format(fileEntry.fileSize / 1024, fileEntry.fileSizeDecompressed / 1024)
  100. +
  101. + output = open(fileEntry.fileName.rstrip('\0'), 'wb')
  102. +
  103. + self.fd.seek(fileEntry.fileOffset)
  104. + if fileEntry.fileSize == fileEntry.fileSizeDecompressed:
  105. + output.write(self.fd.read(fileEntry.fileSize))
  106. + else:
  107. + decompressedBuffer = zlib.decompress(self.fd.read(fileEntry.fileSize))
  108. + output.write(decompressedBuffer)
  109. + output.close()
  110. +
  111. + currentOffset += len(fileEntry)
  112. +
  113. +
  114. class LZ77():
  115. class WiiLZ77: #class by marcan
  116. TYPE_LZ77 = 1
Add Comment
Please, Sign In to add comment