【簡単】バイナリファイルをコマンド一発で生成|echoとprintfコマンド

この記事は約3分で読めます。

ファームウェア開発をしていると、ちょっとしたバイナリファイルを作りたいときがありますよね。よくある方法は、バイナリエディタで作ったり、ちょっと頑張る人なら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........

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

コメント

  1. とくめー より:

    すごく細かいことなんですが,`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`オプションは使えますけどね。

    • とくめー より:

      すいません。リンクの判定がおかしくなってしまいました。