2013-09-24 210 views
1

我有一个保存游戏文件,我试图通过使用十六进制偏移量读取文件来解析出所有的字符属性。自从该纯文本以来,我能够正确地获取所有字符串,但是我在解析正在处理的二进制部分时遇到了问题。python - 使用结构解析二进制文件中的数据

我敢肯定,我在右数据正在读,但是当我解开我得到意想不到的字符串(不正确)输出

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

究竟会收到错误的里尔,有另一种方式或者一种更好的方式去了解从解析领域二进制?

+0

开始寻找到它;我在最后一行计算了一个错字; sturct - > struct – Faultier

+0

我修复了代码中的错误,但是在理解它是什么时我没有取得任何进展,我得到错误导致我得到不正确的输出字段 – user2806298

回答

2

该错误是,虽然值是整数类型,但它们仅具有2的长度,是在C.一个无符号短。因此,你必须阅读它们作为

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

和等等。签名或未签名似乎在这里没有区别。如果可用,请检查保存文件的文档,它应该在那里表示适当。如果不是,祝你好运(itertools可以有所帮助)。

有关类型的详细信息,请检查the Python documentation for structs

表作为辐射1和2的大风扇,我祝你好运和大量的成功与项目( - ;

+0

为了重新编写代码,我开始编写角色编辑器,因为我正在玩这个游戏,这让我有兴趣学习这些更复杂的东西。 o正确读取二进制字段。奇怪的是,我现在也出现以下错误:Traceback(最近一次调用最后一次): “seek2”,line 19,in print“Save game day:”+ str(struct.unpack('> h',buff [0x5B:0x5B + 4])[0]) struct.error:解压缩需要长度为2的字符串参数 即使字符串的长度为4:/ – user2806298

+0

参见上面,您使用+4表示读取四个字节两个,就像我在上面的例子中所做的那样。为了避免这些问题,你可以使用如下的方法:'s ='> H'; struct.unpack(s,buff [.x ..:。x .. + struct.calcsize(s)])[0])' – Faultier

+0

Sheez我应该睡一觉,我甚至没有注意到,我现在做了改变,现在我得到我想要的。f1nk @笔记本电脑:〜/文档/ SAVEGAME/SLOT06 $蟒蛇seek2 保存签名:FALLOUT保存文件 保存版本:65536 字母R,R 角色名字:f1nk 保存游戏名称:教堂 字符串长度:4 串:\t 保存比赛日:22 字符串长度:4 保存游戏一个月:9 保存游戏年:2013 只是一个小细节被拧紧每一件事情了。你可能是一个魔法男人或女人。现在,每一件事情都可以运行,我可以立即完成功能性角色/保存游戏编辑器。再次感谢。 – user2806298