-1

Java ライクなバイトコード用のアセンブラを構築しています。基本的に、これは、オペコードを含むテキスト ファイルから読み取られた文字列を受け取り、コンパイルされたバイナリ データをファイルに書き込む Python 関数です。Example.txt入力文字列 string (から)の例を次に示します。

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) は、正確に 1 バイトの長さ (つまり、0 から 255 の範囲の数値) です。一部のオペコードはオペランドを取り込みますが、これも 1 バイト長です。

メソッドのオペコードのみをバイナリ ファイルに保存するのは非常に簡単です。各オペコードを 0 から 255 の範囲の数値に解析し、 、および を使用しarray.append(op)ますarray.tofile(handle)

ただし、オペコードだけでなく、クラス名、メソッド名などのデータも保存する必要があります。

1 バイト値とより複雑なデータの両方をバイナリ ファイルに保存するにはどうすればよいですか?

こんなものを想定していた...

ファイルはセクションに分かれています。たとえば、最初のセクションはclass Example. 次のセクションは、 によって開始されるセクションですMethod add

class name基本的に、セクションには、 のみを含む name セクションと、 meta セクションと code セクションにサブセクション化される method セクションの 2 種類しかありません。

名前セクションは00(16 進数) で始まり、クラスの名前を提示する必要があります (これは私の問題です)。これ00は基本的に の 16 進表現ですclass。メソッド セクションは で始まりFF、次の数バイトで名前を示す必要があります。次に、プライマリ メソッド セクション内の「0Fメタ セクションの開始」と「コード セクションの開始」を意味する必要があります。F0

ただし、問題が残ります。これらのセクションに名前を付けるにはどうすればよいですか? たとえば「例」の各文字を16進表現である1バイトに変換し、00またはFF. これはおそらく、「セクションの終わり」記号が必要になることを意味します。

これを行うためのより良い/簡単な/すでに実装されている方法はありますか?

4

1 に答える 1

2

あなたは、基本的なPythonの使用法だけでなく、設計についてもかなり広大な質問をしています。質問を少し制限するまで、良い答えが得られるかどうかはわかりません。

ただし、「Example」などの文字列を整数の配列に変換して、に追加できるようにする方法に焦点を当てましょう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']
于 2012-12-15T17:22:54.330 に答える