16 進オフセットを使用してファイルを読み取って、すべての文字属性を解析しようとしているセーブ ゲーム ファイルがあります。そのプレーンテキスト以降、すべての文字列を適切に取得できますが、作業しているバイナリ部分の解析に問題があります。
正しいデータを読み込んでいると確信していますが、文字列を解凍すると、予期しない (正しくない) 出力が得られます
私が使用しているファイルは www.retro-gaming-world.com/SAVE.DAT です
import struct
infile = open('SAVE.DAT','rb')
try:
buff = infile.read()
finally:
infile.close
infile.seek(0x00,0)
print "Save Signature: " + infile.read(0x18)
print "Save Version: " + str(struct.unpack('>i',buff[0x18:0x18+4])[0])
infile.seek(0x1C,0)
print "The letter R: " + infile.read(0x01)
infile.seek(0x1D,0)
print "Character Name: " + infile.read(0x20)
infile.seek(0x3D,0)
print "Save Game Name: " + infile.read(0x1E)
print "Save game day: " + str(struct.unpack('>i',buff[0x5B:0x5B+4])[0])
print "Save game month: " + str(struct.unpack('>i',buff[0x5D:0x5D+4])[0])
print "Save game year: " + str(struct.unpack('>i', buff[0x5F:0x5F+4])[0])
間違ったデータが返されるか、いくつかのフィールドをアンパックしようとすると、文字列の長さが足りないというエラーが表示されます。もっと読むことはできますが、月と年だけですそれぞれ2バイトと4バイトで、整数です。これが正しい方法であるかどうかはわかりません。正しいフィールドをフェッチしていると思いますが、完全ではないにしても、どこかでデータをアンパックまたは誤って処理していると思います。
バージョンは 0100 を返す必要があります 日は 21 を返す必要があります 月は 09 を返す必要があります 年は 2013 を返す必要があります
バイナリからフィールドを解析する別の方法またはより良い方法はありますか?