ファームウェア開発をしているとときどきちょっとバイナリファイルを作りたいときがあります。 そのかんたんな方法を説明します。


echo を使って簡単にバイナリファイルを作成する

ファームウェア開発をしていると、ちょっとしたバイナリファイルを作りたいときがありますよね。よくある方法は、バイナリエディタで作ったり、ちょっと頑張る人ならC言語でプログラム組んだりしますね。 ただ、ちょっとしたバイナリファイルを作成するだけなら bash なら簡単にできますよ。 あの echoprintf コマンドを使うだけです。オプション -en を使えばOKです!

例えば、すべてのbitが1の 4Byteのファイルを作る場合は下記のようにすればOKです。 ちなみにxxd -g1 は1Byteづつ表示するコマンドです。

1
2
3
$ echo -en "\xff\xff\xff\xff" > hoge.bin
$ xxd -g1 hoge.bin
00000000: ff ff ff ff

みんな大好き 0xdeadbeef の場合はこんな感じ。もし「0xdeadbeef について何??」て思った人はこのWikipediaを見てみてくださいね。

1
2
3
$ echo -en "\xde\xad\xbe\xef" > fuga.bin
$ xxd -g1 fuga.bin
00000000: de ad be ef

最後にもう一つ。ARMっ子ならご存知の、無限ループ命令ですね。

1
2
3
$ echo -en "\xea\xff\xff\xfe" > forever_loop.bin
$ xxd -g1  forever_loop.bin
00000000: ea ff ff fe

printf を使って簡単にバイナリファイルを作成する

printfをつかえばさらに柔軟にバイナリを生成できます。まずは先程と同じ 0xdeadbeef を生成する場合。%08x というのは8桁の16進数を表示しろという意味です。

1
2
3
$ printf '%08x' 0xdeadbeef | xxd -r -p > hoge.bin
$ xxd -g1 hoge.bin
00000000: de ad be ef                                      ....

%08x%x とすると、最初が0で始まる値を勝手に0削除してしまうのでNGです。

1
2
3
4
$ printf '%x' 0x00112233 | xxd -r -p > hoge.bin
$ xxd -g1 hoge.bin
00000000: 11 22 33
$

printf なので10進数でも入力できます。

1
2
3
$printf '%08x' 100000 | xxd -r -p > hoge.bin
$ xxd -g1 hoge.bin
00000000: 00 01 86 a0

今度はたとえば100000という10進の値をバイナリにしたいとき。下記のように10進数のまま printf に渡せばOKです。printf のフォーマッターがいい感じにしてくれます。

1
2
3
$ printf '%08x' 1000000 | xxd -r -p > hoge
$ cat hoge |xxd -g1
00000000: 00 0f 42 40

もっと長い値を変換したいときも下記のようにすればOK.

1
2
3
$ printf '%08x' 0x01234567 0xdeadbeef 100000  | xxd -r -p > hoge.bin
$ xxd -g1 hoge.bin
00000000: 01 23 45 67 de ad be ef 00 01 86 a0              .#Eg........

以上、ちょっとしたバイナリファイルを簡単に作成する方法でした!