====== Différences ====== Ci-dessous, les différences entre deux révisions de la page.
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_in, fd_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// |