ファームウェア開発をしていると、ちょっとしたバイナリファイルを作りたいときがありますよね。よくある方法は、バイナリエディタで作ったり、ちょっと頑張る人ならC言語でプログラム組んだりしますね。
ただ、ちょっとしたバイナリファイルを作成するだけなら、MSYS2@WindowsやLinux、OS Xなら簡単にできますよー。
あの echo や printfコマンドを使うだけです。オプション -en を使えばOKです!
(DOS の echo ではできません、念のため)
echo を使って簡単にバイナリファイルを作成する
例えば、全てのbitが1の 4Byte のファイルを作る場合は下記のようにすればOKです。
ちなみに xxd -g1 は1Byteづつ表示するコマンドです。ついでにおぼえておくと便利ですよ。
$ echo -en "\xff\xff\xff\xff" > hoge.bin $ xxd -g1 hoge.bin 00000000: ff ff ff ff
みんな大好き 0xdeadbeef の場合はこんな感じ。もし「0xdeadbeef について何??」て思った人はこのWikipediaを見てみてくださいね。
$ echo -en "\xde\xad\xbe\xef" > fuga.bin $ xxd -g1 fuga.bin 00000000: de ad be ef
最後にもう一つ。ARMっ子ならご存知の、無限ループ命令ですね。
$ 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進数を表示しろという意味です。
$ printf '%08x' 0xdeadbeef | xxd -r -p > hoge.bin $ xxd -g1 hoge.bin 00000000: de ad be ef ....
%08xを%xとすると、最初が0で始まる値を勝手に0削除してしまうのでNGです。
$ printf '%x' 0x00112233 | xxd -r -p > hoge.bin $ xxd -g1 hoge.bin 00000000: 11 22 33 $
printf なので10進数でも入力できます。
$printf '%08x' 100000 | xxd -r -p > hoge.bin $ xxd -g1 hoge.bin 00000000: 00 01 86 a0
今度はたとえば100000という10進の値をバイナリにしたいとき。下記のように10進数のまま printf に渡せばOKです。printfのフォーマッターがいい感じにしてくれます。
$ printf '%08x' 1000000 | xxd -r -p > hoge $ cat hoge |xxd -g1 00000000: 00 0f 42 40
もっと長い値を変換したいときも下記のようにすればOK.
$ 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........
以上、ちょっとしたバイナリファイルを簡単に作成する方法でした!


コメント
すごく細かいことなんですが,`echo`コマンドの(というか所謂Unixコマンドの)統一規格であるPOSIXでは`echo`コマンドに`-en`オプションはありません(参考: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html)。実際に,`echo`コマンドの一つの実装であるOpenBSD上の`echo`コマンドには`-e`オプションはありません(参考: http://man.openbsd.org/echo.1)。
替わりに`printf`コマンドを使うといいと思います。但し,これもPOSIX規格でバイナリデータの数値直接指定には8進数しか使えませんので注意が必要です。
例::
$ printf ‘\352\377\377\376’ > forever_loop.bin
尤も,(私は組込みOSに全く詳しくないのでどうとも言えませんが)組込みOSとしての利用が多い?Linuxに搭載されている`echo`コマンドはBashシェル組込みのもの(参考: https://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html#Bash-Builtins)でもGNU製のもの(参考: https://www.gnu.org/software/coreutils/manual/html_node/echo-invocation.html)でも`-en`オプションは使えますけどね。
すいません。リンクの判定がおかしくなってしまいました。