Pythonはライブラリが充実しているのでバイナリファイルの扱いが簡単にできます。bincopyとobjutilsがいい感じですが、bincopyについて掘り下げます。ちなみにどちらもAnacondaにはない(conda installできない)ので、Python+VSCode on WSLでやる(もうAnaconda+Spyderを卒業しようかと思っている)。
前回の続きで、こういう状態だと思います。で、ターミナルで、まずpipをインストールする(pythonと一緒に入ってくれないらしい)。
sudo apt install python3-pip
しばしまってうまくインストール出来たら
pip3 install bincopy
なんか変なの出るけど、最後に「Successfully installed ...」ってでるので良いとする。
で新規ファイル作成(メニュー「ファイル」から「新規作成」ってすると、ファイルの種類を聞いてくるけど下の絵のようにすると最初にファイル名を入れることができる。で、拡張子で判断してくれるっぽい。)
で、始める前にバイナリファイルの例を作っておく。簡単に作れる(あるイミ大丈夫か?っていう仕様の)TI_TXTを手で作る)。新しいファイル(example.txt)を作って、
@0000
55 AA 55 AA 00 11 22 33 44 55 66 77 0F F0 CC 33
@010E
DE AD BE EF DE AD BE EF DE AD BE EF DE AD
@0120
7E 57 C0 DE 7E 57 C0 DE 7E 57 C0 DE 7E 57 C0 DE
q
って入力して保存。
つぎに、pythonのファイルを作成(bincopy_study1.pyってする)。
で、
import bincopy
f=bincopy.BinFile("example.txt")
print(f.as_ihex())
で、実行。
:1000000055AA55AA00112233445566770FF0CC3318
:0E010E00DEADBEEFDEADBEEFDEADBEEFDEADB0
:100120007E57C0DE7E57C0DE7E57C0DE7E57C0DE03
:00000001FF
となる。いい感じです。
ちなみに、TI_TXTでは1行に16バイト以上詰めてはいけないらしい(少ない分にはよい)。
import bincopy
f=bincopy.BinFile("example.txt")
print(f.as_ihex())
fp_o=open('example_o.hex','w')
fp_o.write(f.as_ihex())
fp_o.close()
ってすると、
って感じで、ファイルに出力できる。
すなわち、バイナリ、TI_TXT、IntelHEX、Motorola-Sを相互に変換できる、、、はず(試してない)。
さて、このbincopyのオブジェクトですが、python内で作りたい(何かファイルがあってそれを読み込むのではなく)ってときにどうするか、、、まずはそもそもbincopyにどういうプロパティやメソッドがあるか調べる。
VSCodeでのデバッグの仕方です(Spyderでは何もせずにデバッグボタンを押せばよかったのですがVSCodeではデバッグボタンを出すための操作があります)。
「実行とデバッグ」ボタンをおす。
で、
launch.json ファイルを作成します。
を押す。
まぁ何となく誘導されるがままに選択する。
こうなる。
で、上のタブでbincopy_study1.pyを選択して、、、するってーと左の上、メニューの下くらいに新たな再生ボタンがあるじゃんね。「デバッグの開始」らしい。ではブレークポイントを設定(コードの左をつつく)してやってみよー。
止まってくれましたー。
で左側に定数窓があってここにbincopy objectのfがあるので掘っていくと、function variablesの下にaddほにゃららっていうメソッドがあることがわかります。後は、VSCodeの補完機能でどういう引数を入れればいいかがわかります。空のbincopy objectを作るにはどうするか、、、何となく引数なしでBinFileメソッドを呼び出せばいけるんじゃないかって試してみる。
ってな感じで、add_binaryだと、引数は(data, address,overwrite)だってことがわかります。こんな感じでいろいろやってみると、
って感じで、文字列的なバイナリ列とか、TI_TXT形式のテキストとか、bytes型とかからbincopy objectが作れましたー。
ちなみに、
[object名].segments[番号].data
でbytearray型で中身をとることができ、
[object名].segments[番号1].data[番号2]=なんちゃら(int型。例えば0xAAとか)
とかすれば一部分だけ内容を変更することもできる。
11行目でブレークして、デバッグコンソールで
k1.segments[0].data[0]=0x66
って入れて継続実行するとターミナルには
:0401000066AA0FF0EC
:00000001FF
:0401000055AA0FF0FD
:00000001FF
:0401000055AA0FF0FD
:00000001FF
って出て、k1だけ55のところが66にできていることがわかります。
一部の業界の人にとって夢のような話です<-大げさ。
コメントをお書きください