-1

我正在为类似 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开始”和“代码部分的开始”。

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

有没有更好/更简单/已经实施的方法来做到这一点?

4

1 回答 1

2

你问了一个关于设计和基本 Python 使用的非常广泛的问题。在您稍微限制问题之前,我不确定您会得到一个好的答案。

但是让我们关注如何将字符串(例如“Example”)转换为整数数组,以便您可以将其附加到您的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']
于 2012-12-15T17:22:54.330 回答