2009-11-10 14 views
6

Si consiglia di utilizzare una piccola utilità della riga di comando (per Windows) per convertire i file da una determinata directory in un file c valido. Forse può essere fatto solo con i comandi batch? Il file risultante dovrebbe essere simile a questo:Convertire file di qualsiasi tipo in un file con stringhe

static const unsigned char some_file[] = { 
    /* some_file.html */ 
    0x2f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0, 
    0x25, 0x21, 0x3a, 0x20, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65 
} 

static const unsigned char some_other_file[] = { 
    /* some_other_file.png*/ 
    0x2f, 0x34, 0x30, 0x34, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0, 
    0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xa, 0x20, 0x20, 0x3c 
} 

P.S. Si prega di non suggerire le porte Perl e Python. Sono troppo pesanti per questo compito.

P.P.S. Qualcuno potrebbe conoscere più utility personalizzabili di bin2h, ma meno pesanti e complesse di awt? Quale può analizzare diversi file e inserirli in una C. Inoltre, specificare i nomi delle variabili personalizzate (usando una sorta di file di indice) dovrebbe essere ottimo. Quindi può essere aggiunto al processo di compilazione.

risposta

5

Bin2h farà questo.

Bin2h - Win32 binario C file di intestazione convertitore

riga di comando Win32 per convertire un file binario in un file di intestazione C , che rappresentano i contenuti di tale file come un blocco di dati.

Non credo che il file di input debba essere un file binario.

+2

Si noti che 'bin2h' non può essere utilizzato per scopi commerciali senza chiedere il permesso all'autore - ma sembra fare il lavoro richiesto. –

+0

probabilmente è così. – cos

+3

Accettato dopo 5 minuti! Sicuro di non avere una risposta migliore allora? – Clifford

13

Utilizzare xxd -i file.

Io uso quello incluso con Vim. Per esempio:

C:\Documents and Settings\user> xxd -i error.log | head -n2 
unsigned char error_log[] = { 
    0x0c, 0x0d, 0x0a, 0x3d, 0x3d, 0x32, 0x30, 0x30, 0x39, 0x2f, 0x35, 0x2f, 

Vedi anche Is it possible to view a binary in ones and zeros?

+0

La versione di xxd su MacOS X 10.5.8 ('xxd -v' dice 'xxd V1.10 27oct98 di Juergen Weigert') non sembra supportare la generazione del codice C. –

+2

@Sinan: No - Sembra essere un PEBKAC; Non riesco a leggere la pagina man in fretta. L'opzione 'xxd -i' funziona bene su MacOS X. –

0

SRecord può farlo, e altro ancora. Anche se non è certo difficile da scrivere il proprio in C.

3

Se si desidera un programma di utilità che può essere utilizzato liberamente (commerciale o qualsiasi altra cosa) ecco una bin2c GPL da Adrian Prantl:

/* 
* bin2c: A Program to convert binary data into C source code 
* Copyright 2004 by Adrian Prantl <[email protected]> 
* 
* This program is free software; you can redistribute it and/or modify 
* it under the terms of the GNU General Public License as published by 
* the Free Software Foundation; either version 2 of the License, or  
* (at your option) any later version. 
* 
*/ 

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

char* self = 0; 

void usage() { 
    printf("Usage:\n%s input.bin output.h name\n\n", self); 
} 

void bail_out(const char* s1, const char* s2) { 
    fprintf(stderr, "%s: FATAL ERROR:\n%s%s\n", self, s1, s2); 
    exit(1); 
} 

int main(int argc, char** argv) { 
    FILE *fi, *fo; 
    int c, i; 

    self = argv[0]; 

    if (argc != 4) { 
     usage(); 
     return 0; 
    } 

    if ((fi = fopen(argv[1], "rb")) == 0) 
     bail_out("Cannot open input file ", argv[1]); 

    if ((fo = fopen(argv[2], "w")) == 0) 
     bail_out("Cannot open output file ", argv[2]); 

    if ((c = fgetc(fi)) != EOF) { 
     fprintf(fo, "#ifndef %s_H\n", argv[3]); 
     fprintf(fo, "#define %s_H\n\n", argv[3]); 
     fprintf(fo, "const unsigned char %s[] = {\n", argv[3]); 
     fprintf(fo, c < 16 ? " 0x%02x" : " 0x%02x", (unsigned char) c); 
    } 

    i = 1; 
    while ((c = fgetc(fi)) != EOF) { 
     if (i < 12) 
      fprintf(fo, c < 16 ? ", 0x%02x" : ", 0x%02x", (unsigned char) c); 
     else { 
      fprintf(fo, c < 16 ? ",\n 0x%02x" : ",\n 0x%02x", (unsigned char) c); 
      i = 0; 
     } 
     i++; 
    } 
    fprintf(fo, "\n};\n\n"); 
    fprintf(fo, "#endif\n"); 

    printf("converted %s\n", argv[1]); 

    return 0; 
} 

Si tratta di un unico 70 linea o file C, niente da compilare ed eseguire.

+0

Qual è lo scopo di 'c <16' nel ciclo' while'? La seconda e la terza parte dell'operatore ternario sono identiche, quindi è solo uno spreco di istruzioni, no? –

+0

@RobW: Suppongo che a un certo punto ci sia stata una differenza; forse qualcosa come 'c <16? ", 0x0% x": ", 0x% x" '. Sono d'accordo che liberarsi di quelle espressioni avrebbe senso. –

Problemi correlati