Dostęp do skompresowanych danych
14 July 2008
Comments
Pliki SAV oraz niektóre pliki BIF (o nagłówku BIFC) zawierają dane skompresowane za pomocą biblioteki zlib. W przypadku BIFC jest to jeden plik, dla SAV jest to wiele plików. Odczyt podstawowych danych z pliku sav z pomocą modułu struct nie stanowi problemu. Nowością jest jednak dekompresja za pomocą zlib. Poniższy kod rozkoduje plik SAV i zapisze wszystko w odpowiednich plikach.
import struct
import zlib
# w tym samym katalogu musi być plik SAV
plik = open('baldur.sav', 'rb')
try:
tekst = plik.read()
finally:
plik.close()
# dane zaczynają się od:
a = 0x0004 + 4
# aż dojedziemy do końca pliku dekompresujemy wszystko:
while a < len(tekst):
lenght = struct.unpack('i', tekst[a:a+4])[0]
print 'Długość pliku: ' + str(lenght)
# nazwa pliku jest zmienna
filename = str(tekst[a+4:a+16])
# dzielimy nazwę na 2 części, kropka jest dzielnikiem
file_name = filename.split('.')
# ext to rozszerzenie ze śmieciami
ext = file_name[1]
# usuwamy śmiecie czytając tylko 3 pierwsze znaki :)
file_name = file_name[0] +'.'+ ext[0:3]
print 'Nazwa Pliku: ' + file_name
decomp_size = struct.unpack('i', tekst[a+0x0004+lenght:a+0x0004+lenght+4])[0]
print 'Rozmiar po rozpakowaniu: ' + str(decomp_size)
comp_size = struct.unpack('i', tekst[a+0x0008+lenght:a+0x0008+lenght+4])[0]
print 'Rozmiar skompresowanego pliku: ' + str(comp_size)
if decomp_size != 0:
code = tekst[a+0x000c+lenght:a+0x000c+lenght+comp_size]
open(file_name, 'wb').write(zlib.decompress(code))
print 'Dane zapisane jako ' + file_name
a = a+0x000c+lenght+comp_size
print "----------------------------"
RkBlog
Comment article