Outils pour utilisateurs

Outils du site


allegro:code_memfile

Ce code est un programme qui crée un tableau de bytes à partir d'un fichier binaire afin d'être utilisé avec l'addon memfile.

mem_maker.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FORMAT "0x%2.2x"
#define suffix "};" // 2 bytes
#define prefix "char file_array[] = {" // 21 bytes
#define sep ", " // 2 bytes
#define eol "\n\t" // 2 byte
#define BYTES_PER_LINES 20
 
int main(int argc, char *argv[]) {
   FILE *in, *out;
   int i, cpt=1;
   size_t val;
   unsigned char value[BYTES_PER_LINES];
   unsigned char cont[] = "0xFF"; // 4 bytes  -  la valeur sera changée
   unsigned char buflen[25];
 
   if (argc != 3) {
	  printf("%s, convertit un fichier binaire en un tableau de char utilisable dans un programme\n", argv[0]);
	  puts("Ce programme attend 2 arguments de la ligne de commande :");
	  puts("\t- le chemin de la source\n\t- le chemin pour l'output");
	  return -1;
   }
 
   if (!(in  = fopen(argv[1], "rb"))) return -1;
   if (!(out = fopen(argv[2], "wb"))) return fclose(in),-1;
 
   if (fread(value, sizeof(char), 1, in) != 1) goto cleanup;
   sprintf(cont, FORMAT, value[0]);
   fwrite(prefix, sizeof(char), 21, out); fwrite(cont, sizeof(char), 4, out);
 
   while ((val = fread(value, sizeof(char), BYTES_PER_LINES, in)) > 0) {
	  fwrite(sep, sizeof(char), 2, out); fwrite(eol, sizeof(char), 2, out);
	  cpt += val;
	  for (i=0; i<val; i++) {
		 sprintf(cont, FORMAT, value[i]);
		 fwrite(cont, sizeof(char), 4, out);
		 if (i != val-1) fwrite(sep, sizeof(char), 2, out);
	  }
   }
   fwrite(suffix, sizeof(char), 2, out);
   sprintf(buflen, "\n// Longeur = %d", cpt);
   fwrite(buflen, sizeof(char), strlen(buflen), out);
 
   fclose(in); fclose(out);
 
   return 0;
 
cleanup:
   fclose(in); fclose(out);
   fputs("conversion failed\n", stderr);
   return 0;
}

La taille du tableau est vérifiable en faisant du -b fichier_binaire

allegro/code_memfile.txt · Dernière modification: 2015/01/17 03:32 par mrhide