31385


C言語で書いているプログラムで固定の画像を使いたいのですが、マルチプラットフォームなのでプログラムのバイナリに埋め込んでしまうのが一番手っ取り早いと思います。  
ソースに入れる必要はありませんが、環境ごとに違う「リソース」の様なものは避けたいです。何か良い方法はあるでしょうか。


CC BY-SA 3.0
2016-12-25T07:41:36.887
31362
2016-12-25T11:32:38.970
3974
question
c
C言語のソース?にバイナリを埋め込む方法


`unsigned char`の配列として持つことになると思います。

例えば、

[code]

    int main(void){
        extern unsigned char bindata[];
        //bindata を用いた処理
    }
    
[/code]

のようにして  
`addBin program.c data.bin`  
のようなプログラムで、プログラムの末尾に書き込みます。  
すると、次のような形で埋め込まれる。

[code]

    int main(void){
        extern unsigned char bindata[];//これはヘッダファイルにする方がいいかも
        //bindata を用いた処理
    }
    unsigned char bindata[] = {
    24,45,68,84,251,33,9,64,};
    
[/code]

あるいは末尾ではなく別のファイルに書き出して、コンパイルしておいて、リンクする。  
`addBin databin.c data.bin` //databin.cは空または存在しないファイル

`gcc -c databin.c`  
`gcc main.c databin.o`

addBin.c のサンプル

[code]

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main(int argc, char **argv){
        if(argc != 3){
            fprintf(stderr, "Usage: %s program_source data_file\n", argv[0]);
            exit(EXIT_FAILURE);
        }
        FILE *fpw = fopen(argv[1], "a");
        FILE *fpr = fopen(argv[2], "rb");
        //fpw and fpr null check
        fprintf(fpw, "\nunsigned char bindata[] = {\n");
        int ch;
        while((ch = getc(fpr)) != EOF){
            fprintf(fpw, "%u,", ch);//適宜改行を入れる？
        }
        fprintf(fpw, "};\n");
        fprintf(fpw, "#include <stddef.h>\n");
        fprintf(fpw, "size_t bindata_size = sizeof bindata;\n");
    
        fclose(fpw);fclose(fpr);
        return 0;
    }
    
[/code]


CC BY-SA 3.0
2016-12-25T08:37:49.453
31376
2016-12-25T11:32:38.970
2016-12-25T11:32:38.970
5044
5044
31362
answer


補足。Linuxではxxdコマンドに-iオプションを指定するとバイナリデータをC言語形式に変換できます。

[code]

    $ xxd -i 1x1.png
    unsigned char __1x1_png[] = {
      0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
      0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
      0x08, 0x06, 0x00, 0x00, 0x00, 0x1f, 0x15, 0xc4, 0x89, 0x00, 0x00, 0x00,
      0x06, 0x62, 0x4b, 0x47, 0x44, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xa0,
      0xbd, 0xa7, 0x93, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00,
      0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b, 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18,
      0x00, 0x00, 0x00, 0x0d, 0x49, 0x44, 0x41, 0x54, 0x08, 0xd7, 0x63, 0xf8,
      0xff, 0xff, 0xff, 0x7f, 0x00, 0x09, 0xfb, 0x03, 0xfd, 0xd1, 0x83, 0x8c,
      0xf0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60,
      0x82
    };
    unsigned int __1x1_png_len = 109;
    
[/code]


CC BY-SA 3.0
2016-12-25T10:54:32.077
31385
2016-12-25T10:54:32.077
4010
31362
answer