Advertisement
Guest User

Untitled

a guest
Apr 20th, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.23 KB | None | 0 0
  1. from struct import unpack
  2. from os import makedirs
  3. from os.path import exists
  4. import os
  5.  
  6. with open("dvdroot.dat", "rb") as f:
  7. # "SONICHEROESDAT\x00\x00", file count, section 1 (filenames), section 2 (pathnames,
  8. # has "dvdroot" at the start so no need to append foldername), section 3 (data block,
  9. # offsets table is relative)
  10. header = unpack("<16s4I", f.read(0x20))
  11. offsets = [(header[4] + unpack("<I", f.read(4))[0]) for i in range(header[1])]
  12. #extract ^^^ absolute offset
  13. f.seek(0, 2)
  14. offsets.append(f.tell())
  15. # append EOF so we don't have an off-by-one
  16. for i in range(header[1]):
  17. f.seek(header[3] + (i * 0x20)) #section 2 = folder names
  18. folder = f.read(0x20).rstrip("\x00") #padded to 0x20, just read whole thing
  19. folder = folder.replace("/", "\\")
  20. folder = folder.split("\\")
  21. folder = os.sep.join(folder) #work for all OSes
  22. f.seek(header[2] + (i * 0x20)) #section 1 = filenames
  23. filename = f.read(0x20).rstrip("\x00")
  24. if not exists(folder):
  25. makedirs(folder) #make folder to extract to
  26. with open(folder + filename, "wb") as o:
  27. f.seek(offsets[i])
  28. o.write(f.read(offsets[i+1] - offsets[i])) #no off by one ^^^
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement