Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import io
- import struct
- import os
- class MOTFile:
- """MOT File TODO"""
- def __init__(self, data):
- self.data = data
- @property
- def is_valid(self):
- """Returns true iff the data size is equal to the size of all
- contained files"""
- try:
- return len(self.data) == self.offset(self.num_files - 1) + self.size(self.num_files-1)
- except:
- return False
- @property
- def num_files(self):
- return struct.unpack("I", self.data[:4])[0]
- @property
- def header_size(self):
- size = 4 + self.num_files * 4
- # Round to a multiple of 16
- return ((size + 15) // 16) * 16
- def offset(self, i):
- if i == 0:
- return self.header_size
- else:
- return self.size(i-1) + self.offset(i-1)
- return struct.unpack("I", self.data[4+(i*8):8+(i*8)])[0]
- def size(self, i):
- start = 4 + i*4
- return struct.unpack("I", self.data[start:start+4])[0]
- def file(self, i):
- offset = self.offset(i)
- size = self.size(i)
- return self.data[offset:offset+size]
- def describe(self):
- res = io.StringIO()
- res.write(f"Total Size: {len(self.data)}\n")
- res.write(f"Valid: {self.is_valid}\n")
- for n in range(self.num_files):
- offset = self.offset(n)
- size = self.size(n)
- res.write(f"{n:01d}: offset {offset}, size {size}\n")
- return res.getvalue()
- def unpack_to(self, path):
- os.makedirs(path, exist_ok=True)
- for i in range(self.num_files):
- fbytes = self.file(i)
- if MOTFile(fbytes).is_valid:
- MOTFile(fbytes).unpack_to(os.path.join(path, f"{i:03d}"))
- else:
- with open(os.path.join(path, f"{i:03d}"), "wb") as f:
- f.write(fbytes)
Advertisement
Add Comment
Please, Sign In to add comment