Necesito un script o una herramienta que lee un archivo binario y salidas de C/C++ código fuente de la matriz (que representa el contenido del archivo). ¿Hay alguna?


(Esta pregunta fue eliminado anteriormente. Pongo esta pregunta, porque es valioso. Yo estaba buscando exactamente esto en Google y no encontré nada. Por supuesto que es algo trivial código de mí mismo, pero me habría ahorrado algunos minutos, si me hubiera encontrado un script sencillo. Por lo tanto es valioso.

Esta pregunta también había un montón de votos sin mucha explicación. Por favor comente antes de bajar a la votación por qué crees que esto es de ningún valor o de valor incorrecto.

Esta pregunta también causó una gran confusión acerca de lo que yo estoy preguntando acerca de. Si algo no está claro, por favor pregunte. Realmente no sé cómo hacer que sea más claro. Ver las respuestas de los ejemplos.

También (después de poner la pregunta aquí), ya tengo varias respuestas. Sólo quiero poner/link aquí (de nuevo) porque yo creo que puede ser de utilidad para alguien más en busca de este.)

  • Probablemente, la gente entiende que quería algún tipo de decompiler o cosas por el estilo. Usted puede reformular como «lee un archivo binario y salidas de C/C++ declaración de un array inicializado con el contenido del archivo» o algo así.
InformationsquelleAutor Albert | 2012-01-03

6 Comentarios

  1. 119

    En Debian y otras distribuciones de Linux se instala por defecto (junto con vim) la xxd herramienta, que, dada la -i opción, puede hacer lo que quiera:

    [email protected]:~/Desktop$ echo Hello World\! > temp
    [email protected]:~/Desktop$ xxd -i temp 
    unsigned char temp[] = {
      0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x21,
      0x0a
    };
    unsigned int temp_len = 13;
    • Ah bueno! Está disponible en MacOSX.
    • Justo lo que estaba buscando 🙂 gracias!
    • tenido cero problemas de la integración de xxd en Visual Studio 2013 solución en Windows. Yo solía esta fuente
    • El único problema podría ser que esta matriz no es const (así como de la duración). Esto puede hacer una diferencia en los microcontroladores (RAM vs ROM). Usted puede necesitar para editar los archivos generados.
    • sí, aunque por lo que he visto, por ejemplo, en los microcontroladores AVR const no sería suficiente, si usted desea permanecer en la memoria flash tiene que agregar atributos específicos del proveedor (PROGMEM en gcc); me temo que este caso es probablemente demasiado específicas para una herramienta de propósito general, usted probablemente querrá escribir una generación específica de secuencia de comandos.
    • Estoy de acuerdo. He envuelto, por lo que se envía el resultado a través de | sed 's/unsigned/const unsigned/', y se podría decir cualquier otra cosa que usted necesita en esta línea. (I poner el resultado en un archivo separado – para ser fácilmente sobrescribir).
    • Tenga en cuenta que el tamaño del encabezado será más grande que el original de archivo binario , esto podría no ser un problema, pero en algunos casos g++ no compilar el fuente de transmitir el mensaje de error : «cc1plus.exe: fuera de la asignación de memoria *********** bytes»
    • ¿Y qué es de 16 o 32 bits de datos?

  2. 6

    Una simple herramienta se puede encontrar aquí:

    #include <stdio.h>
    #include <assert.h>
    
    int main(int argc, char** argv) {
        assert(argc == 2);
        char* fn = argv[1];
        FILE* f = fopen(fn, "rb");
        printf("char a[] = {\n");
        unsigned long n = 0;
        while(!feof(f)) {
            unsigned char c;
            if(fread(&c, 1, 1, f) == 0) break;
            printf("0x%.2X,", (int)c);
            ++n;
            if(n % 10 == 0) printf("\n");
        }
        fclose(f);
        printf("};\n");
    }
    • Usted tendrá extra «,» al final de su matriz de char antes «}»
    • Que no es un problema, se compila en C++.
  3. 1

    La aceptada respuesta usando xxd herramienta es agradable si usted está en un *nix como sistema. Aquí es un «one-liner» para cualquier sistema que tiene python ejecutable en la ruta:

    python -c "import sys;a=sys.argv;open(a[2],'wb').write(('const unsigned char '+a[3]+'[] = {'+','.join([hex(b) for b in open(a[1],'rb').read()])+'};').encode('utf-8'))" <binary file> <header file> <array name>

    < archivo binario > es el nombre del archivo que quieres convertir en un encabezado de C, < archivo de encabezado > es el nombre del archivo de encabezado, y < nombre de la matriz > es el nombre que se desea que la matriz a tiene.

    La de arriba de la línea de comando Python hace aproximadamente la misma como la siguiente (mucho más legible) programa de Python:

    import sys
    
    with open(sys.argv[2],'wb') as result_file:
      result_file.write(b'const char %s[] = {' % sys.argv[3].encode('utf-8'))
      for b in open(sys.argv[1], 'rb').read():
        result_file.write(b'0x%02X,' % b)
      result_file.write(b'};')
  4. 0

    Esta herramienta recopila en el desarrollador de símbolo del sistema en C. Se produce la salida a la terminal de visualización de los contenidos en la «array_name.c» el archivo que se crea. Tenga en cuenta que algunos terminales puede mostrar el «\b» de caracteres.

        #include <stdio.h>
        #include <assert.h>
    
        int main(int argc, char** argv) {
        assert(argc == 2);
        char* fn = argv[1];
    
        //Open file passed by reference
        FILE* f = fopen(fn, "rb");
        //Opens a new file in the programs location
        FILE* fw = fopen("array_name.c","w");
    
        //Next two lines write the strings to the console and .c file
        printf("char array_name[] = {\n");
        fprintf(fw,"char hex_array[] = {\n");
    
        //Declare long integer for number of columns in the array being made
        unsigned long n = 0;
    
        //Loop until end of file
        while((!feof(f))){
            //Declare character that stores the bytes from hex file
            unsigned char c;
    
            //Ignore failed elements read
            if(fread(&c, 1, 1, f) == 0) break;
            //Prints to console and file, "0x%.2X" ensures format for all
            //read bytes is like "0x00"
            printf("0x%.2X,", (int)c);
            fprintf(fw,"0x%.2X,", (int)c);
    
            //Increment counter, if 20 columns have been made, begin new line
            ++n;
            if(n % 20 == 0){
                printf("\n");
                fprintf(fw,"\n");
            }
        }
    
        //fseek places cursor to overwrite extra "," made from previous loop
        //this is for the new .c file. Since "\b" is technically a character
        //to remove the extra "," requires overwriting it.
        fseek(fw, -1, SEEK_CUR);
    
        //"\b" moves cursor back one in the terminal
        printf("\b};\n");
        fprintf(fw,"};\n");
        fclose(f);
        fclose(fw);
    }
  5. 0

    Este es un archivo binario para la matriz C generador de código fuente de python, que es idéntico programa en Albert respuesta.

    import sys
    from functools import partial
    
    if len(sys.argv) < 2:
      sys.exit('Usage: %s file' % sys.argv[0])
    print("char a[] = {")
    n = 0
    with open(sys.argv[1], "rb") as in_file:
      for c in iter(partial(in_file.read, 1), b''):
        print("0x%02X," % ord(c), end='')
        n += 1
        if n % 16 == 0:
          print("")
    print("};")
  6. 0

    La pregunta es viejo, pero permítanme sugerir simple herramienta que puede ser utilizada como alternativa…

    Puede usar interfaz gráfica de usuario basada herramienta llamada Líquido. En realidad, es utilizado para el diseño de la interfaz para FLTK toolkit, pero también puede generar unsigned char matriz de C++ de archivo binario. Descargar desde muquit.

    guión/herramienta para convertir el archivo en C/C++ código fuente de la matriz de

Dejar respuesta

Please enter your comment!
Please enter your name here