Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from struct import unpack
- from os import makedirs
- from os.path import exists
- import os
- with open("dvdroot.dat", "rb") as f:
- # "SONICHEROESDAT\x00\x00", file count, section 1 (filenames), section 2 (pathnames,
- # has "dvdroot" at the start so no need to append foldername), section 3 (data block,
- # offsets table is relative)
- header = unpack("<16s4I", f.read(0x20))
- offsets = [(header[4] + unpack("<I", f.read(4))[0]) for i in range(header[1])]
- #extract ^^^ absolute offset
- f.seek(0, 2)
- offsets.append(f.tell())
- # append EOF so we don't have an off-by-one
- for i in range(header[1]):
- f.seek(header[3] + (i * 0x20)) #section 2 = folder names
- folder = f.read(0x20).rstrip("\x00") #padded to 0x20, just read whole thing
- folder = folder.replace("/", "\\")
- folder = folder.split("\\")
- folder = os.sep.join(folder) #work for all OSes
- f.seek(header[2] + (i * 0x20)) #section 1 = filenames
- filename = f.read(0x20).rstrip("\x00")
- if not exists(folder):
- makedirs(folder) #make folder to extract to
- with open(folder + filename, "wb") as o:
- f.seek(offsets[i])
- o.write(f.read(offsets[i+1] - offsets[i])) #no off by one ^^^
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement