机甲世纪一些资源所在目录:
\机甲世纪Ⅱ\AOA\RESOURCE
其中Fonts.pcg文件应该是空数据文件,只包含文件头数据,所以可以结合其他文件进行比较分析,这里比较Effects.pcg
Fonts.pcg
Effects.pcg
代码:
#! /usr/bin/env python
# -*- coding: gb2312 -*-
#
#
#
# Usage:
# python <fileName> <资源文件> <目标文件夹>
#
# example:
# python extractor.py UI.pcg temp
import sys, os
import os.path
import binascii
#转换小端模式 int
def lETransformInt(hexString):
sbr=""
j=0
for i in range(len(hexString)-1,-1,-1):
sbr = sbr + hexString[i]
return int(binascii.b2a_hex(sbr), 16)
#转换小端模式 String
def lETransformStr(hexString):
sbr=""
j=0
for i in range(len(hexString)-1,-1,-1):
sbr = sbr + hexString[i]
return binascii.b2a_hex(sbr)
#创建目录 并构造文件路径
def getRootDir(path):
fullPath = os.getcwd() + "\\"+ sys.argv[2] +"\\"
fileName = os.path.basename(path)
reFilePath = path.split(fileName)[0]
fullPath = fullPath + reFilePath
if not os.path.isdir(fullPath):
os.makedirs(fullPath)
return fullPath + fileName
#按路径写入文件
def wtiteFileWithPathAndHex(path, HexStr):
fileName = getRootDir(path)
hexF = open(fileName, "wb")
hexF.write(HexStr)
hexF.close()
if len(sys.argv) != 3 :
print "Usage:\n\tpython <fileName> <资源文件> <目标文件夹> \nexample:\n\tpython extractor.py The_Spell.vst temp "
else:
f = open(sys.argv[1], "rb")
#17 定位到文件个数段
f.seek(17, 0)
#读取文件数目
fileCount = lETransformInt(f.read(4))
globalOffset = 61
print fileCount
fileNum = 0
while fileNum < fileCount:
fileNum = fileNum + 1
#定位到偏移地址
f.seek(globalOffset, 0)
#print "--------------" + str(globalOffset)
#读取文件名长度
filePathLength = lETransformInt(f.read(2))
#print filePathLength
#读取文件路径
filePath = f.read(filePathLength)
print "path:" + binascii.b2a_hex(filePath) + "\n" +filePath
#读取偏移长度 文件大小
offsetAdd = lETransformInt(f.read(4))
#print "offsetAdd:" + str(offsetAdd)
#移过32字节
f.seek(32, 1)
#读取偏移地址 文件起始地址
originAdd = lETransformInt(f.read(4))
#print "originAdd:" + str(originAdd)
#按偏移地址读取
f.seek(originAdd, 0)
#获取偏移的长度的数据
fileStr = f.read(offsetAdd)
wtiteFileWithPathAndHex(filePath, fileStr)
#计算文件索引位置
globalOffset = globalOffset + 118 + filePathLength