Положить внешний файл в виде массива байтов в исходник на Си.
Бывает надо для сохранения во флешке рисунков шрифтов, картинок, звуков и тп.
Для этого достаточно прочитать побайтно исходный файл и записать его в текстовом
виде в файл исходника.
Код..
#include <stdio.h>
#include <conio.h>
#include <string.h>
int main(int argc, char* argv[])
{
printf("bin 2 .h converter\n");
FILE *inpfile;
FILE *outfile;
unsigned char a;
char tmpstr[256];
unsigned int toread=0;
unsigned int towrite=0;
unsigned long flen=0;
unsigned int bytecnt=0;
//--------------------------------------------------------------------------- открыть входной файл
inpfile = fopen(argv[1], "rb");
if (inpfile!=NULL)
{
fseek(inpfile,SEEK_SET,SEEK_END);
flen = ftell(inpfile);
fseek(inpfile,SEEK_SET,0);
}
else
{
printf("ERROR: can't open the file: %s\n",argv[1]);
return -1;
}
//--------------------------------------------------------------------------- открыть выходной файл
outfile = fopen(argv[2], "wb");
if (outfile!=NULL)
{
fseek(outfile,SEEK_SET,SEEK_END);
}
else
{
printf("ERROR: can't open the file: %s\n",argv[2]);
fclose(inpfile);
return -1;
}
//--------------------------------------------------------------------------- разбираем входной и пишем выходной
printf("input len: %ld\n",flen);
sprintf(tmpstr,"#include <avr/pgmspace.h>\nconst unsigned char %s PROGMEM={\n",argv[3]);
towrite = strlen(tmpstr);
fwrite(tmpstr, towrite, 1,outfile); //записываем заголовок файла и имя массива
for (bytecnt = 0; bytecnt < flen; bytecnt++)
{
toread = 1; //читаем байт
fread(&a,toread,1,inpfile);
sprintf(tmpstr,"0x%X",a); //выводим в шестнадцатиричном виде
towrite = 2;
fwrite(tmpstr, towrite, 1,outfile); //пишем в выходной файл
if (bytecnt < (flen - 1))
{
sprintf(tmpstr,","); //запятая, если не последний байт
towrite = strlen(tmpstr);
fwrite(tmpstr, towrite, 1,outfile); //
}
if ((bytecnt & 0x0F) == 0x0f) //перевод строки каждые 16 байт
{
sprintf(tmpstr,"\n");
towrite = strlen(tmpstr);
fwrite(tmpstr, towrite, 1,outfile); //
}
}
sprintf(tmpstr,"\n};\n"); //закрывающая скобка
towrite = strlen(tmpstr);
fwrite(tmpstr, towrite, 1,outfile); //
fclose(outfile);
fclose(inpfile);
return 0;
}
|