#!/usr/bin/env python3 import struct import os #from pathlib import Path def unpack_one_file(fin, dir_out): file_hdr = fin.read(8) (fname_len, fdata_len) = struct.unpack('ii', file_hdr) fname = fin.read(fname_len) fdata = fin.read(fdata_len) fname = fname[0:fname_len-1] fname = fname.decode("utf-8") print("File name %s length=%d" % (fname, fdata_len)) path_dir = Path(fname).parent unpack_dir = os.path.join(dir_out, path_dir) out_fname = os.path.join(dir_out, fname) try: os.makedirs(unpack_dir) except FileExistsError as e: pass with open(out_fname, "wb") as fout: fout.write(fdata) def unpack_files(fin, num_files, dir_out): for i in range(num_files): unpack_one_file(fin, dir_out) def unpack_tzar(fname, dir_out): with open(fname, "rb") as fin: hdr = fin.read(16) (magic, tzar_count, tzar_len, tzar_num_files) = struct.unpack('iiii', hdr) print(hex(magic)) print("Total number of files: " + str(tzar_num_files)) unpack_files(fin, tzar_num_files, dir_out) if __name__ == "__main__": fname_in = "tzar" dir_out = "tzar_out" unpack_tzar(fname_in, dir_out)