コード例 #1
0
ファイル: forge.py プロジェクト: k3v1n1990s/ACExplorer
	def __init__(self, py_ubi_forge, path: str, forge_file_name: str):
		"""Initiate the class and read the header tables to get the locations of the files.

		The forge file has a couple of data tables before the actual data that points to where the actual data is stored.
		These tables are parsed and the data from them stored for each datafile in self.datafiles for use later
		"""
		BaseForge.__init__(self, py_ubi_forge, path, forge_file_name)
		self.pyUbiForge.log.info(__name__, f'Building file tree for {forge_file_name}')

		forge_file = FileObjectDataWrapper.from_file(self.pyUbiForge, self.path)
		# header
		if forge_file.read_str(8) != b'scimitar':
			return
		forge_file.seek(1, 1)
		forge_file_version, file_data_header_offset = forge_file.read_struct('iQ')
		if forge_file_version != 27:
			raise Exception(f'Unsupported Forge file format : "{forge_file_version}"')
		forge_file.seek(file_data_header_offset + 36)
		file_data_offset = forge_file.read_int_64()
		forge_file.seek(file_data_offset)
		# File Data
		index_count, index_table_offset, file_data_offset2, name_table_offset, raw_data_table_offset = forge_file.read_struct('i4x2q8x2q')
		forge_file.seek(index_table_offset)
		index_table = forge_file.read_struct('QQI' * index_count)
		forge_file.seek(name_table_offset)
		name_table = forge_file.read_struct('i40x128s20x' * index_count)
		for n in range(index_count):
			file_id = index_table[n * 3 + 1]
			file_name = name_table[n * 2 + 1].replace(b'\x00', b'').decode("utf-8")
			if index_table[n * 3 + 2] != name_table[n * 2]:
				raise Exception('These should be the same. Is something wrong?')
			self._datafiles[file_id] = DataFile(
				index_table[n * 3],
				index_table[n * 3 + 2],
				file_name
			)

		forge_file.close()
コード例 #2
0
    def __init__(self, py_ubi_forge, path: str, forge_file_name: str):
        """Initiate the class and read the header tables to get the locations of the files.

		The forge file has a couple of data tables before the actual data that points to where the actual data is stored.
		These tables are parsed and the data from them stored for each datafile in self.datafiles for use later
		"""
        BaseForge.__init__(self, py_ubi_forge, path, forge_file_name)
        self.pyUbiForge.log.info(__name__,
                                 f'Building file tree for {forge_file_name}')

        forge_file = FileObjectDataWrapper.from_file(self.pyUbiForge,
                                                     self.path)
        # header
        if forge_file.read_bytes(8) != b'scimitar':
            return
        forge_file.seek(1, 1)
        forge_file_version, file_data_header_offset = forge_file.read_struct(
            'iQ')
        if forge_file_version != 27:
            raise Exception(
                f'Unsupported Forge file format : "{forge_file_version}"')
        forge_file.seek(file_data_header_offset + 36)
        file_data_offset = forge_file.read_int_64()
        forge_file.seek(file_data_offset)
        # File Data
        index_count, index_table_offset, file_data_offset2, name_table_offset, raw_data_table_offset = forge_file.read_struct(
            'i4x2q8x2q')
        forge_file.seek(index_table_offset)
        index_table = forge_file.read_numpy([('raw_data_offset', numpy.uint64),
                                             ('file_id', numpy.uint64),
                                             ('raw_data_size', numpy.uint32)],
                                            20 * index_count)
        forge_file.seek(name_table_offset)
        name_table = forge_file.read_numpy(
            [
                ('raw_data_size', numpy.uint32),
                ('', numpy.uint64),
                ('', numpy.uint32),
                ('file_type', numpy.uint32),
                ('', numpy.uint64),
                ('', numpy.uint32),  # next file count
                ('', numpy.uint32),  # previous file count
                ('', numpy.uint32),
                ('', numpy.uint32),  # timestamp
                ('file_name', 'S128'),
                ('', numpy.uint32),
                ('', numpy.uint32),
                ('', numpy.uint32),
                ('', numpy.uint32),
                ('', numpy.uint32)
            ],
            192 * index_count)
        for n in range(index_count):
            if index_table['raw_data_size'][n] != name_table['raw_data_size'][
                    n]:
                raise Exception(
                    'These should be the same. Is something wrong?')
            self._datafiles[int(index_table['file_id'][n])] = DataFile(
                int(index_table['raw_data_offset'][n]),
                int(index_table['raw_data_size'][n]),
                name_table['file_name'][n].replace(b'\x00',
                                                   b'').decode("utf-8"),
                int(name_table['file_type'][n]))

        forge_file.close()