2012-12-15 182 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']