Sono un fan del obsoleto gioco Age of Empires II (AoE). Voglio scrivere un parser del record di gioco AoE (file .mgx) usando Python.parsing age of empires file di registrazione del gioco (.mgx)
Ho fatto qualche ricerca su GitHub e ho trovato piccoli progetti su questo, il più utile è aoc-mgx-format che fornisce some details of .mgx game record files.
Qui è il problema:
base al riferimento, struttura di un file .MGX è come:
| header_len (4byte int) | next_pos (4byte int) | header_data | ... ... |
L'ordine dei byte dei dati esadecimali in formato mgx è little endian.
header_len memorizza lunghezza dati della parte di intestazione (header_len + next_post + header_data)
header_data esercizi Imformation utile ho bisogno, ma la sua compresso con zlib
ho provato a decomprimere i dati in header_data con il modulo zlib come questo:
import struct
import zlib
with open('test.mgx', "rb") as fp:
# read the header_len bytes and covert it to a int reprents length of Header part
header_len = struct.unpack("<i", fp.read(4))[0]
# read next_pos (this is not important for me)
next_pos = struct.unpack("<i", fp.read(4))[0]
# then I can get data length of header_data part(compressed with zlib)
header_data_len = header_len - 8
compressed_data = fp.read(header_data_len)[::-1] # need to be reversed because byte order is little endian?
try:
zlib.decompress(compressed_data)
print "can be decompressed!"
except zlib.error as e:
print e.message
ma ho ottenuto questo dopo l'esecuzione del programma:
Errore -3 mentre decompressione dei dati: controllo di intestazione errata
ps: provate .MGX file possono essere trovati qui: https://github.com/stefan-kolb/aoc-mgx-format/tree/master/parser/recs
I dati non devono essere invertiti perché l'ordine dei byte è little-endian. Li hai già convertiti da little-endian in nativo usando '" abarnert
C'è un errore nella tua domanda, dove dici "obsoleto gioco Age of Empires", penso che tu intenda "meravigliosamente fantastico gioco Age of Empires" . –
Ad ogni modo, quando risolvi il problema (rimuovendo '[:: - 1]', questo corregge quell'errore e ti dà invece l'errore corretto -3, lamentando che EC BD non assomiglia ad un metodo di compressione valido. Dato che di solito vedrai 79 9C o 79 DA all'inizio di un blob compresso zlib valido, potrebbe valere la pena di scansionare il file per quei byte ... – abarnert