2

我的工作要求我执行数学模拟,其参数来自二进制文件。模拟器可以毫无问题地读取这样的二进制文件。

但是,我需要查看二进制文件以确保参数是我需要的参数,而我似乎无法做到这一点。

我想用 Python 编写一个脚本,它可以让我读取二进制文件,搜索我关心的参数,并显示它们的值。

我对二进制文件的了解:

它代表简单的文本(与图像或声音文件相反)。有一段代码可以将文件“转储”为可读格式:如果我在 Emacs 中打开该转储,我会发现如下内容:

CENTRAL_BODY = 'SUN'

所有的文件只是一系列类似的指令。我可以使用该转储代码,但我更愿意让 Python 这样做。

这似乎是一个非常微不足道的问题,我很抱歉没有更好地了解。我以为我是一个熟练的程序员!

非常感谢。

4

4 回答 4

4

您可以将文件的内容读入内存中的字符串:

thedata = open(thefilename, 'rb').read()

然后在其中找到一个字符串:

where = thedata.find('CENTRAL_BODY')

最后切掉你关心的部分:

thepart = thedata[where:where+50]  # or whatever length

thepart并按您喜欢的方式显示它(例如,通过在符号内查找字符串值=,然后是后面的第一个引号,然后是后面的下一个引号)。

于 2009-10-18T20:34:38.397 回答
1

如果是二进制文件,则需要使用 struct 模块。您将需要知道数据在文件中的格式。如果没有记录,您将不得不对其进行逆向工程。

你有其他倾销程序的源代码吗?您也许可以将其移植到 Python

如果我们能看到二进制文件和相应的转储是什么样子,我们可能会为您提供更好的帮助

于 2009-10-18T20:50:07.210 回答
1

听起来这个“转储”程序已经完成了您需要的工作:解释二进制文件。我想我的方法是编写一个 python 程序,它可以接受一个转储文件,提取你想要的参数并显示它们。

然后用这样的东西解析它:

myparms.py:

import sys

d = {}
for line in sys.stdin:
    parts = line.split("=",2)
    if len(parts) < 2:
        continue
    k = parts[0].strip()
    v = parts[1].strip()
    d[k] = v

print d['CENTRAL_BODY']

像这样使用:

转储参数.bin | python myparms.py

您没有提及平台或提供有关转储格式的详细信息,但这应该是一个开始的地方。

于 2009-10-18T22:38:06.523 回答
0

您必须知道数据存储的格式;根本没有办法解决这个问题。

如果没有书面规范,请尝试在十六进制编辑器中打开它并研究格式,使用文本转储作为参考。如果您可以获得创建文本转储的工具的源代码,那将对您有很大帮助。

请记住,数据可能会以某种方式被打乱,例如 rot13。

于 2009-10-19T01:24:08.490 回答