xxdで魔法のようにバイナリを生成する

7-2. バイナリ処理


アニメ『魔法科高校の劣等生』(2013)

魔法アニメで特に好きなアニメです。魔法を学問のように扱っている世界観がいいです。勉強ができる優等生は、当然魔法がうまく使えるし、勉強できない下級生はまともに魔法が使えません。
魔法とエンジニアリングの融合も、惹きつけられる発想です。今年は映画もあるようなので見たいなあと思っています。

コマンドラインは、コマンドという呪文を唱え、そして小さな呪文を組み合わせ、より大きな仕事ができる、ってところが、魔法っぽいなあと思います。
大魔法を使えるようになるために、小さなコマンドもばかにせず日々吸収していきたいです。

ラリーウォール(Larry Wall)を崇拝している私なので、いつもバイナリファイル生成はPerlでやってしまいますが、当然Perlを使わなくてもバイナリファイルぐらい作れますね。
今回はxxdコマンドを使ってみます。

takk@deb8:~$ echo '0: 00 01 02 03 04' | xxd -r > test.bin
takk@deb8:~$ od -tx1 test.bin
0000000 00 01 02 03 04
0000005

アドレス:値1 値2 値3 …

という形式でテキストを作れば、xxd -rコマンドでバイナリファイルに変換できます。

連番でバイナリ生成してみましょう。

takk@deb8:~$ printf '%02x ' 0 {1..10} | xxd -r > test.bin
takk@deb8:~$ od -tx1 -Ax test.bin
000000 01 02 03 04 05 06 07 08 09 0a
00000a
takk@deb8:~$ 

0 {1..10}の、0がアドレス、1〜10が値となります。

アドレスに0以外を設定すると、指定したアドレスまでの値を0で補完してくれます。

takk@deb8:~$ echo '5: 00' | xxd -r > test.bin
takk@deb8:~$ od -tx1 -Ax test.bin
000000 00 00 00 00 00 00
000006
takk@deb8:~$ 

指定したアドレスまでの0補完なので、指定アドレス以降は、書いた値がそのままバイナリとなります。

takk@deb8:~$ echo '5: 33' | xxd -r > test.bin
takk@deb8:~$ od -tx1 -Ax test.bin
000000 00 00 00 00 00 33
000006
takk@deb8:~$ echo '5: 11 22' | xxd -r > test.bin
takk@deb8:~$ od -tx1 -Ax test.bin
000000 00 00 00 00 00 11 22
000007
takk@deb8:~$ 

アドレスだけ指定して、値を何も書かないと、このように空ファイルが生成されます。

takk@deb8:~$ echo '5:   ' | xxd -r > test.bin
takk@deb8:~$ od -tx1 -Ax test.bin
000000
takk@deb8:~$ ls -l test.bin
-rw-r--r-- 1 takk takk 0  5月 11 22:08 test.bin
takk@deb8:~$ 

256バイトのオール0のバイナリを生成する場合は、生成したバイト数-1をアドレスとして、00を書けばよいです。

takk@deb8:~$ echo '255:00' | xxd -r > test.bin
takk@deb8:~$ od -tx1 -Ax test.bin
000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
*
000250 00 00 00 00 00 00
000256
takk@deb8:~$ 

コメント

タイトルとURLをコピーしました