我正在构建一个类似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”为其十六进制表示形式的单个字节,然后将这些文件保存在00
或FF
之后。这可能意味着我需要一些“节结束”符号。
是否有更好/更简单/已经实现的方法?