【问题标题】:python - Parsing data from binary file using structspython - 使用结构从二进制文件中解析数据
【发布时间】:2013-09-24 09:39: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])

我遇到了两个不同的问题,要么返回了错误的数据,要么当我尝试解压缩某些字段时,我收到一个错误,即字符串不够长,我可以阅读更多内容,但日期月份和year 分别只有 2 个字节和 4 个字节并且是整数,我不确定我是否以正确的方式进行处理,我相信我正在获取正确的字段,但认为我在某些地方不正确地解包或处理数据完全。

版本应该返回 0100 天应该返回 21 月份应该返回 09 年份应该返回 2013

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

【问题讨论】:

  • 开始调查;我在最后一行发现了一个错字; sturct--> 结构
  • 我修正了代码中的错字,但在理解错误方面没有取得任何进展,导致我的字段输出不正确

标签: python struct binary unpack


【解决方案1】:

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

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

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

有关类型的更多详细信息,请查看the Python documentation for structs上的表格

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

【讨论】:

  • 为了重新开始编码,我承担了编写字符编辑器的项目,因为我正在玩这个项目,这让我有动力去学习这些更复杂的东西。只是似乎无法正确读取二进制字段。奇怪的是,我现在也收到以下错误 Traceback(最近一次调用最后一次):文件“seek2”,第 19 行,在 中打印“保存比赛日:” + str(struct.unpack('>h',buff [0x5B:0x5B+4])[0]) struct.error: unpack 需要长度为 2 的字符串参数,即使字符串的长度为 4 :/
  • 见上文,您使用 +4 表示读取四个字节而不是两个字节,就像我在上面的示例中所做的那样。为避免这些问题,您可以使用以下内容:s='>H'; struct.unpack(s, buff[.x..:.x..+struct.calcsize(s)])[0])
  • Sheez 我可能应该睡觉了我什至没有注意到,我做了改变,现在我得到了我想要的。f1nk@laptop:~/Documents/SAVEGAME/SLOT06$ python seek2 保存签名:FALLOUT保存文件 保存版本:65536 字母 R:R 角色名称:f1nk 保存游戏名称:church 字符串长度:4 字符串:保存游戏日:22 字符串长度:4 保存游戏月份:9 保存游戏年份:2013 只是一个小细节这把所有事情都搞砸了。你是一个神奇的男人或女人,也许永远如此。现在一切正常,我可以立即完成功能性角色/保存游戏编辑器。再次感谢。
  • “魔法”伴随着实践——我已经对一些文件进行了逆向工程,因此现在知道了一些常见的错误(;
猜你喜欢
  • 2021-12-14
  • 2019-10-11
  • 2017-04-12
  • 1970-01-01
  • 1970-01-01
  • 2014-08-23
  • 2014-11-12
  • 2011-02-24
  • 2015-12-31
相关资源
最近更新 更多