PDA

Просмотр полной версии : конвертор файлов


Fedia22
16.08.2012, 00:06
есть небольшой код на питоне

def main():
import struct
import sys
import os
import shutil

if len(sys.argv) != 2:
print("Usage: " + sys.argv[0] + " res-file")

with open(sys.argv[1],'rb') as fin:
outdata = fin.read()
fin.close()

head = struct.unpack('iiii',outdata[:16])

if head[0] == 27058749:
print("Resource from russian version")
fmtstr1="iih"
fmtstr2="ii"
elif head[0] == 27058748:
print("Resource from english version")
fmtstr1="iiiih"
fmtstr2="i"
else:
print("Unknown version resource")
sys.exit(2)


print("Total objects:\t\t%d\nOffset to FATTable:\t%d\nSize of NameFAT:\t%d\n" % (head[1],head[2],head[3]))

x=0
ft=[]
marks1={}
marks2={}
mlist=[]
for i in range(head[1]):
FATEntry1 = struct.unpack_from(fmtstr1,outdata[head[2]+x:])
x = x + struct.calcsize(fmtstr1)
FATEntry2 = struct.unpack_from(fmtstr2,outdata[head[2]+x:])
x = x + struct.calcsize(fmtstr2)
#(filesize,name_len,file_offset,name_offset)
if head[0] == 27058749:
ft.append((FATEntry1[0],FATEntry1[1],FATEntry1[2],FATEntry2[0],FATEntry2[1]))
else:
ft.append((FATEntry1[0],FATEntry1[1],FATEntry1[4],FATEntry1[2],FATEntry2[0],FATEntry1[3]))
x=head[2]+x

try:
os.mkdir(sys.argv[1]+'_unp')
except:
pass
os.chdir(sys.argv[1]+'_unp')

for i in ft:
tfn = outdata[x+i[4]:x+i[4]+i[2]]
tpth = tfn.decode('utf-8').split('\\')
if len(tpth) > 1:
mkpth=''
for j in range(len(tpth)-1):
if mkpth == '':
mkpth = tpth[j]
else:
mkpth = mkpth+"\\"+tpth[j]
try:
os.mkdir(mkpth)
except:
pass
fout = open(tfn,'wb')
fout.write(outdata[i[3]:i[3]+i[1]])
if i[0] != -1:
if tfn in marks1:
print("Error")
else:
marks1[tfn] = i[0]

mlist.append(tfn)
if head[0] == 27058748:
marks2[tfn] = i[5]

fout.close()

os.chdir("..")

fout = open(sys.argv[1]+'_repacked','wb')
fout.write(struct.pack('i', 27058748))
fout.write(struct.pack('i', len(mlist)))
tf=[]
ofsft=16
nofs=0
for i in mlist:
with open(bytes(sys.argv[1] + "_unp",'utf-8') + b'\\' + i,'rb') as fin:
outdata = fin.read()
fin.close()
tf.append((outdata,i))
ofsft=ofsft+len(outdata)

fout.write(struct.pack('i', ofsft))

nft=b''
for i in tf:
nft=nft+i[1]

fout.write(struct.pack('i', len(nft)))

ft=b''
x=16
y=0
for i in tf:
fout.write(i[0])

tt=i[1]
if tt in marks1:
musv = marks1[tt]
else:
musv = -1

if tt in marks2:
musv2 = marks2[tt]
else:
musv2 = 0

ft=ft+struct.pack('i', musv)
ft=ft+struct.pack('i', len(i[0]))
ft=ft+struct.pack('i', x)
x=x+len(i[0])
ft=ft+struct.pack('i', musv2)
ft=ft+struct.pack('h', len(i[1]))
ft=ft+struct.pack('i', y)
y=y+len(i[1])

fout.write(ft)
fout.write(nft)

fout.close()

shutil.rmtree(sys.argv[1]+'_unp')

if __name__ == '__main__':
main()

есть несколько файлов с расширением *.res, слова человека
Так вот если взять и запустить на 3-ем питоне, да еще указать в качестве параметра файлы с расширением .res то на выходе получится что то нужно


вот теперь вопрос к гуру, как запустить? и как указать в параметре этот самый файл с расширением .res? :sorry: просто я с питоном не когда дело не имел вообще, только впервые столкнулся с этим удавом (он же питон)

TOM_RUS
16.08.2012, 00:26
В командной строке пишите:
название_скрипта параметры_скрипта

Fedia22
16.08.2012, 01:06
:) спасибо) хоть какая то зацепка) я так понял теперь этот скрипт что в теге кода нужно сохраниеть в файл, и запустить через командную строку, а что в параметре писать? не подскажете? (знаю глупо, но опять же - всё что есть я выше уже отписал) :(

TOM_RUS
16.08.2012, 01:22
:) спасибо) хоть какая то зацепка) я так понял теперь этот скрипт что в теге кода нужно сохраниеть в файл, и запустить через командную строку, а что в параметре писать? не подскажете? (знаю глупо, но опять же - всё что есть я выше уже отписал) :(

Путь к файлу, не?

Fedia22
21.08.2012, 23:12
http://s002.youpic.su/pictures/1345579200/ff865f945667759eb1d77e59e22391c0.jpg


и всё таки что я делаю не так?

TOM_RUS
21.08.2012, 23:18
Надо в cmd писать это, а не в интерпретаторе питона...

Fedia22
21.08.2012, 23:21
FXD: Спасибо ТОМ_РУС :) всё сделано))) так бы ещё мучился фиг знает сколько)