RkBlog

Hardware, programming and astronomy tutorials and reviews.

Odczyt danych skompresowanych zlibem

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

Modowanie Silnika Infinity, 14 July 2008, Piotr Mali艅ski

Comment article