1

我有一个保存游戏文件,我试图通过使用十六进制偏移读取文件来解析所有字符属性。从纯文本开始,我能够正确取出所有字符串,但我在解析我正在使用的二进制部分时遇到问题。

我很确定我正在读取正确的数据,但是当我解压缩字符串时,我得到了意外(不正确)的输出

我正在使用的文件是 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

我到底在哪里弄错了,有没有另一种方法或更好的方法来解析二进制文件中的字段?

4

1 回答 1

2

错误是,尽管这些值是整数类型,但它们的长度仅为 2,在 C 中是无符号短整数。因此,您必须将它们读为

struct.unpack('>H',buff[0x5B:0x5B+2])[0])

等等。签名或未签名似乎在这里没有什么区别。如果可用,请检查保存文件的文档,应在此处注明合适的位置。如果没有,祝你好运(itertools可能会有所帮助)。

有关类型的更多详细信息,请查看Python 文档中的表以获取结构

作为 Fallout 1 和 2 的忠实粉丝,我祝你好运并在项目中取得成功(-;

于 2013-09-24T11:50:51.550 回答