2011-12-28 4 views
0

je dois stocker quelque chose dans la source en tant que tableau de caractères que je peux le lire plus tard,magasin un « fichier » dans « code source pure c » comme char *

comment stocker dans le fichier source comme pointeur char et comment convertir un fichier binaire en pointeur char?

Je me souviens d'avoir déjà vu une démo qui utilisait cette façon de publier une petite démo sans porter de petits fichiers, comme 5k ou même 100k de taille de fichier.

+0

oh, la « taille du fichier » modifier à la fin du poste a vraiment fait les choses maintenant clair. –

+0

Si je comprends bien, vous souhaitez intégrer des données binaires dans votre exécutable de sorte que vous n'avez pas besoin de le fournir en tant que fichier séparé? –

+0

oui c'est ça, j'utilise gcc et c pure, je pense que j'ai besoin d'un moyen de convertir un fichier binaire en un format et de le coller en tant que char * fichier1 = {coller stuff}; ??? – user1051003

Répondre

0

J'utilise habituellement simple Perl/Ruby/script Python pour convertir des données binaires en code source C:

# Python script bin_to_c.py 
import sys 

i = 0 
res = [] 
res.append("unsigned char data[] = \"") 
for c in sys.stdin.read(): 
    if i % 15 == 0: 
    res.append("\"\n \"") 
    res.append("\\x%02x" % ord(c)) 
    i += 1 

print ''.join(res) + '";' 
print "size_t data_size = sizeof(data) - 1;" 

Vous pouvez ensuite coller la sortie dans un fichier C, comme ceci:

python bin_to_c.py <input.bin> data.c 
0

Je ne suis pas sûr si vous voulez ouvrir un fichier binaire ou un mode binaire.

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    FILE *fp = NULL; 
    int len = 0; 
    char * file_buff = NULL; 

    if ((fp = fopen("file1", "rb")) == NULL) { 
     printf("Failed to open file\n"); 
     return EXIT_FAILURE; 
    } 

    fseek(fp, 0, SEEK_END); 
    len = ftell(fp); 
    fseek(fp, 0, SEEK_SET); 

    if ((file_buff = (char *) malloc((int)sizeof(char) * len)) == NULL) { 
     printf("ERROR: unable to allocate memory\n"); 
     return EXIT_FAILURE; 
    } 

    fread(file_buff, len, 1, fp); 
    fclose(fp); 

    printf("Contents of the file : \n%s", file_buff); 

    /* do whatever you wanted to do with file_buff here */ 

    /* once done, free the file buffer */ 
    free(file_buff); 

    return EXIT_SUCCESS; 
} 
2

L'outil xxd peut le faire:

xxd -i inputfile