如何使用Python将数据写入二进制文件

时间:2012-12-15 17:08:38

标签: python file hex binaryfiles

我正在为类似Java的字节码构建汇编程序。本质上,它是一个Python函数,它接收一个字符串,该字符串是从包含操作码的文本文件中读取的,并将编译后的二进制数据写入文件。以下是输入字符串字符串(来自Example.txt)的示例:

class Example

Method add

meta
lva 4

code
0: ipush 1 0
1: ipush 2 2
2: iload 1
3: iload 2
4: iadd
5: istore 3
6: iload 3
7: ireturn

我的任务是将Example.txt文本文件转换为二进制表示形式(我的虚拟机的机器代码)。每个操作码(例如iadd)恰好是一个字节长(即,在0到255范围内的数字)。一些操作码采用操作数,也是一个字节长。

在二进制文件中仅保存方法的操作码非常简单。我将每个操作码解析为0到255范围内的数字,并使用array.append(op),然后使用array.tofile(handle)

但是,我不仅需要保存操作码,还需要保存数据,例如类的名称,方法的名称等。

如何将单字节值和更复杂的数据保存到二进制文件中?

我设想过这样的事情......

该文件分为几个部分。例如,第一部分是class Example。下一部分是由Method add开始的部分。

基本上,只有两种类型的部分,名称部分,只包含class name,以及方法部分,然后将其划分为元和代码部分。

名称部分以00(十六进制)开头,然后需要显示该类的名称(这是我的问题)。 00本质上是class的十六进制表示。方法部分以FF开头,然后它们也需要在接下来的几个字节中显示其名称。然后,我可以0F表示“元段的开头”和F0“代码段的开头”在主要方法部分内。

然而,问题仍然存在。我如何命名这些部分?我有一个转换每个字符的想法,例如“示例”为其十六进制表示形式,单个字节,然后在00FF之后将其保存在文件中。这可能意味着我需要一些“结束部分”符号。

是否有更好/更简单/已实施的方法?

1 个答案:

答案 0 :(得分:2)

您正在问一个关于设计以及基本Python使用的非常庞大的问题。在你稍微限制一下这个问题之前,我不确定你会得到一个好的答案。

但是让我们关注如何转换字符串的问题,例如“示例”,为整数数组,以便您可以将其附加到array。确保你有一个字节串;如果你有一串Unicode字符,请务必先将其编码为一个字节数组。 (如果您使用的是Python 2.x,则string已经是一个字节数组。)

out = [0]  # your output array

s = "Example" # a byte string, not a Unicode string
l = list(s)   # convert to array of ints

out = out + l
print out

给出:

[0, 'E', 'x', 'a', 'm', 'p', 'l', 'e']
相关问题