Advertisement
Guest User

GAMEDATA.CFI unpack

a guest
Sep 20th, 2016
312
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.17 KB | None | 0 0
  1. import os
  2. import struct
  3. import gzip
  4.  
  5. def ensure_dir(path_name):
  6. if not os.path.exists(path_name):
  7. os.makedirs(path_name)
  8.  
  9. TOC = []
  10. with open('GAMEDATA.CFI', 'rb') as f:
  11. folders = ord(f.read(1))
  12. for folder in range(folders):
  13. size = ord(f.read(1))
  14. folder_name = f.read(size).decode('ascii')
  15. files = ord(f.read(1))
  16. if files == 0xFC:
  17. files = struct.unpack('<H', f.read(2))[0]
  18. for file in range(files):
  19. size = ord(f.read(1))
  20. file_name = f.read(size).decode('ascii')
  21. offset, size = struct.unpack('<II', f.read(8))
  22. TOC.append((folder_name, file_name, offset, size))
  23. base_pos = f.tell()
  24. for folder_name, file_name, offset, size in TOC:
  25. ensure_dir(folder_name)
  26. path = folder_name + file_name
  27. f.seek(base_pos + offset)
  28. with open(path, 'wb') as g:
  29. if file_name[-4:] in ('.txt', '.dat', '.PNG', '.sbk'):
  30. g.write(f.read(size))
  31. else:
  32. zsize = size - 4
  33. size = struct.unpack('<I', f.read(4))[0]
  34. g.write(gzip.decompress(f.read(zsize)))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement