我正在为类似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
“代码段的开头”在主要方法部分内。
然而,问题仍然存在。我如何命名这些部分?我有一个转换每个字符的想法,例如“示例”为其十六进制表示形式,单个字节,然后在00
或FF
之后将其保存在文件中。这可能意味着我需要一些“结束部分”符号。
是否有更好/更简单/已实施的方法?
答案 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']