Dostęp do skompresowanych danych

Wykorzystanie dekompresji zlib oraz modułu struct do odczytu binarnych danych z plików SAV gry Baldurs Gate

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 "----------------------------"
blog comments powered by Disqus

Kategorie

Strony