Outils pour utilisateurs

Outils du site


allegro:code_memfile

====== Différences ====== Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

allegro:code_memfile [2012/01/21 23:34]
mrhide créée
allegro:code_memfile [2015/01/17 03:32] (Version actuelle)
mrhide
Ligne 1: Ligne 1:
 +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.\\
 +
 <file c mem_maker.c>​ <file c mem_maker.c>​
 #include <​stdio.h>​ #include <​stdio.h>​
 #include <​stdlib.h>​ #include <​stdlib.h>​
-#include <unistd.h>​ +#include <string.h>
-#include <fcntl.h>+
 #define FORMAT "​0x%2.2x"​ #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 #define BYTES_PER_LINES 20
 + 
 int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
-   int fd_infd_out, i, val+   FILE *in*out
-   char value[BYTES_PER_LINES]+   int i, cpt=1
-   char suffix[] = "};"; // 2 bytes +   size_t val
-   ​char ​prefix[] = "char file_array[] = {"// 21 bytes +   unsigned ​char value[BYTES_PER_LINES]; 
-   char cont  [] = "​0xFF";​ // 4 bytes  -  la valeur sera changée +   unsigned ​char cont[] = "​0xFF";​ // 4 bytes  -  la valeur sera changée 
-   ​char ​sep   [] = ", "// 2 bytes +   unsigned ​char buflen[25]; 
-   char eol   [] = "​\n\t";​ // 2 byte + 
    if (argc != 3) {    if (argc != 3) {
-      ​printf("​%s,​ convertit un fichier binaire en un tableau de char utilisable dans un programme\n",​ argv[0]); +   ​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("​Ce programme attend 2 arguments de la ligne de commande :"); 
-      puts("​\t- ​l'​@ ​de la source\n\t- ​l'​@ ​pour l'​output"​);​ +   ​puts("​\t- ​le chemin ​de la source\n\t- ​le chemin ​pour l'​output"​);​ 
-      return -1;+   ​return -1;
    }    }
- +    
-   if (!(fd_in  ​= ​open(argv[1], ​O_RDONLY))) return -1; +   if (!(in  ​= ​fopen(argv[1], ​"​rb"​))) return -1; 
-   if (!(fd_out ​open(argv[2], ​O_WRONLY|O_CREAT))) return -1; +   if (!(out fopen(argv[2], ​"​wb"​))) return ​fclose(in),-1; 
- +  
-   if (read(fd_in, ​value, 1) != 1) goto cleanup; +   if (fread(value, sizeof(char), 1, in) != 1) goto cleanup; 
-   ​sprintf(cont,​ FORMAT, value); +   ​sprintf(cont,​ FORMAT, value[0]); 
-   write(fd_out, ​prefix, 21); write(fd_out, ​cont, 4); +   fwrite(prefix, sizeof(char), 21, out); fwrite(cont, sizeof(char), 4, out); 
- +  
-   while ((val = read(fd_in, ​value, BYTES_PER_LINES)) > 0) { +   while ((val = fread(value, sizeof(char), BYTES_PER_LINES, in)) > 0) { 
-      write(fd_out, ​sep, 2); write(fd_out, ​eol, 2); +   fwrite(sep, sizeof(char), 2, out); fwrite(eol, sizeof(char), 2, out); 
-      for (i=0; i<val; i++) { +   cpt += val; 
-         ​sprintf(cont,​ FORMAT, ​*(value+i)); +   ​for (i=0; i<val; i++) { 
-         write(fd_out, ​cont, 4); +  sprintf(cont,​ FORMAT, value[i]); 
-         ​if (i != val-1) ​write(fd_out, ​sep, 2); + fwrite(cont, sizeof(char), 4, out); 
-      }+  if (i != val-1) ​fwrite(sep, sizeof(char), 2, out); 
 +   ​}
    }    }
-   write(fd_out, ​suffix, 2); +   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: cleanup:
-   close(fd_in); close(fd_out); +   fclose(in); fclose(out); 
 +   fputs("​conversion failed\n",​ stderr);
    ​return 0;    ​return 0;
 } }
- 
 </​file>​ </​file>​
 +
 +La taille du tableau est vérifiable en faisant //du -b fichier_binaire//​
allegro/code_memfile.1327185245.txt.gz · Dernière modification: 2012/01/21 23:34 par mrhide