使用Python处理人可读的二进制数据
我的工作需要我进行一个数学模拟,这个模拟的参数来自一个二进制文件。模拟器可以毫无问题地读取这个二进制文件。
不过,我需要打开这个二进制文件,看看里面的参数是否是我需要的,但我似乎无法做到这一点。
我想用Python写一个脚本,这样我就可以读取这个二进制文件,查找我关心的参数,并显示它们的值。
关于这个二进制文件,我知道:
它表示的是简单的文本(而不是图像或声音文件)。有一段代码可以把文件“转储”成可读的格式:如果我在Emacs中打开这个转储,我会看到一些类似这样的内容:
CENTRAL_BODY = 'SUN'
整个文件其实就是一系列类似的指令。我可以使用那个转储代码,但我更希望用Python来完成这个工作。
这似乎是个很简单的问题,我为自己不知道而感到抱歉。我原以为自己是个熟练的程序员呢!
非常感谢。
4 个回答
如果这是一个二进制文件,你需要使用一个叫做结构模块(struct module)的工具。你得知道文件里数据是怎么排版的。如果没有相关的说明文档,你就得自己去分析它。
你有没有其他转储程序的源代码?你可能可以把它直接移植到Python里。
如果我们能看到这个二进制文件和对应的转储内容,可能会更好地帮助你。
你可以把文件的内容读到内存中的一个字符串里:
thedata = open(thefilename, 'rb').read()
然后在这个字符串里找到你想要的内容:
where = thedata.find('CENTRAL_BODY')
最后把你关心的部分切出来:
thepart = thedata[where:where+50] # or whatever length
然后按照你的需要显示出来(比如,可以通过在 thepart
中找到一个 =
符号,然后找到第一个后面的引号,再找到下一个引号来找到字符串的值)。
听起来这个“dump”程序已经能满足你的需求了:它可以解读二进制文件。我想我的做法是写一个Python程序,能够读取这个dump出来的文件,提取你想要的参数并显示出来。
然后可以用类似这样的方式来解析:
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']
使用方法如下:
dump parameters.bin | python myparms.py
你没有提到具体的平台或者dump出来的格式的细节,但这应该是一个好的起点。