バイナリデータを組み込みプログラムを組み込む

すでにあるバイナリファイルをC言語のソースに取り込みたいことはあると思います。例えば、組み込み開発ではビットマップデータやフォントデータ、各種テーブルファイルなどをROM内部に組み込みたい場合などです。

組み込みのプログラム内にバイナリデータを組み込む場合の方法にはいろいろな種類があると思います。
たとえば、hex(またはS-record)形式のファイルをマージする方法、そして、バイナリデータをC言語で表現可能な形式にコンバートしてそのままコンパイルする方法などです。
今回は、バイナリデータをunsigned char型の配列の形式に変換する方法を解説します。

Rubyスクリプトでそのまま変換

今回の説明は簡単です。以下のRubyスクリプトを実行します。このスクリプトファイル名をbin2c.rbとした場合、以下のようにコマンドラインで入力すればOKです。


C:\Work>ruby bin2c.rb test.bin test.inc

このようにすると、バイナリファイル「test.bin」がC言語の配列での指定する形式で「test.inc」というファイル名で保存されます。
スクリプトはシンプルで、以下のようになっています。

$pat = ARGV

f = open($pat[0],"r");
fout = open($pat[1],"w");

cnt = 0;

fout.printf("\t");

while(c = f.getc())

    fout.printf("0x%02x,",c);

    if ((cnt+1) % 8 == 0) then
        fout.printf("\n\t");
    end
    
    cnt = cnt + 1;
end

fout.printf("\n\t");
f.close;
fout.close;

printf("Finished\n");

C言語への導入方法

上で説明したスクリプトで出力したファイルをインクルードすればOKです。仮に、バイナリから変換されたファイルをtest.incとした場合、以下のようにしてみて下さい。

const char test_bin[] = {
#include "./test.inc"
};

このように使用すれば、「test_bin[]」はtest.binのバイナリファイルの内容と同じものが指し示されます。


Author: projectc3@gmail.com
Last modified: Sun Jul 31 07:00:17 JST 2005