我正在構建一個類似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
之後。這可能意味着我需要一些「節結束」符號。
是否有更好/更簡單/已經實現的方法?