2012-12-15 93 views
-1

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

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“开始的代码节”。

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

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

回答

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']