2009-11-10 7 views
6

Proszę zasugerować małe narzędzie wiersza poleceń (dla systemu Windows) do konwersji plików z określonego katalogu do poprawnego pliku c. Może można to zrobić tylko za pomocą poleceń wsadowych? Wynikowy plik powinien wyglądać tak:Konwertuj pliki dowolnego typu do pliku z ciągami c

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. Nie sugeruj portów Perl i Python. Są za ciężkie do tego zadania.

P.P.S. Może ktoś zna bardziej konfigurowalne narzędzie niż bin2h, ale mniej ciężki i złożony niż awt? Które mogą parsować kilka plików i umieszczać je w jednym C. Również specyfikacja nazw zmiennych niestandardowych (przy użyciu jakiegoś pliku indeksu) powinna być świetna. Można go więc dodać do procesu budowania.

Odpowiedz

5

Bin2h zrobi to.

Bin2h - Win32 binarnego C nagłówka pliku kalkulator

Win32.Przykład Narzędzie wiersza do konwersji pliku binarnej w pliku nagłówka C reprezentujące zawartość tego pliku jako blok dane.

Nie wierzę, że plik wejściowy musi być plikiem binarnym.

+2

Zauważ, że "bin2h" nie może być używany do celów komercyjnych bez uzyskania zgody autora - ale wydaje się, że wykonuje to zadanie. –

+0

prawdopodobnie to wszystko. – cos

+3

Zaakceptowany po 5 minutach! Na pewno nie ma lepszej odpowiedzi? – Clifford

13

Użyj xxd -i file.

Używam tej dołączonej do Vim. Na przykład:

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, 

Zobacz także Is it possible to view a binary in ones and zeros?

+0

Wersja xxd na MacOS X 10.5.8 ("xxd -v" mówi "xxd V1.10 27oct98 od Juergen Weigert") nie obsługuje generowania kodu C. –

+2

@Sinan: Nie, wydaje się być PEBKAC; Nie mogę szybko przeczytać strony podręcznika. Opcja "xxd -i" działa poprawnie na MacOS X. –

0

SRecord może zrobić, i więcej. Choć trudno się trudne do napisania własnych w C.

3

Jeśli chcesz narzędzie, które może być dowolnie używany (komercyjny lub cokolwiek) oto GPL bin2c 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; 
} 

To jeden 70 linia lub tak plik C - nic do niego, aby skompilować i uruchomić.

+0

Jaki jest cel 'c <16' w pętli' while'? Druga i trzecia część trójskładnikowego operatora są identyczne, więc to tylko strata instrukcji, nie? –

+0

@RobW: Sądzę, że w pewnym momencie była różnica, która odeszła; może coś w rodzaju 'c <16? ", 0x0% x": ", 0x% x" '. Zgodzę się, że pozbycie się tych wyrażeń miałoby sens. –

Powiązane problemy