2012-01-03 11 views
49

Potrzebuję skryptu/narzędzia, które odczyta plik binarny i wypisze tablicę kodu źródłowego C/C++ (która reprezentuje zawartość pliku). Czy są jakieś?skrypt/narzędzie do konwersji pliku na tablicę kodu źródłowego C/C++


(To pytanie zostało usunięte wcześniej. I umieścić z powrotem w to pytanie, ponieważ jest cenny. Szukałem dokładnie to w Google i nie znalazłem nic. Oczywiście to jest trywialne zakodować sobie ale zaoszczędziłbym kilka minut, gdybym znalazł taki prosty scenariusz, a więc jest on cenny:

Te pytania miały również wiele głosów oddanych bez większych wyjaśnień. Proszę o komentarz przed głosowaniem w dół, dlaczego uważasz, że tak jest bez wartości lub złej wartości

To pytanie spowodowało również wiele zamieszania w związku z tym, o co pytam. jest niejasna, proszę pytać. Naprawdę nie wiem, jak to wyjaśnić. Zobacz odpowiedzi na przykłady.

Również (po postawieniu pytania tutaj), mam już kilka odpowiedzi. Chcę tylko, aby umieścić/połączyć je tutaj (znowu), ponieważ myślę, że może to być przydatne dla kogoś szukasz to)

+2

Prawdopodobnie ludzie zrozumieli, że chcieliście mieć jakiś dekompilator lub coś takiego. Możesz go zmienić na "odczytuje plik binarny i wypisuje deklarację C/C++ tablicy zainicjalizowanej do zawartości pliku" lub coś w tym stylu. –

Odpowiedz

82

na Debianie i inne dystrybucje Linuksa jest instalowany domyślnie (wraz z vim) narzędzia xxd, co przy opcji -i, może robić to, co chcesz:

[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; 
+4

Ah nice! Jest nawet dostępny w MacOSX. – Albert

+0

Właśnie tego szukałem :) dzięki! –

+2

miał zero problemów z integracją xxd z rozwiązaniem Visual Studio 2013 w systemie Windows. Użyłem [tego źródła] (http://www.opensource.apple.com/source/vim/vim-43/vim/src/xxd/xxd.c?txt) – Spike0xff

5

Jedno proste narzędzie można znaleźć here.

#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"); 
} 
+0

Będziesz miał dodatkowe "," na końcu tablicy znaków przed "}" – rkosegi

+0

To nie jest problem, kompiluje się w C++. – sashoalm

0

To narzędzie kompiluje w wierszu polecenia developer w C. produkuje wyjście do terminalu wyświetlającego zawartość w utworzonym pliku "array_name.c". Zwróć uwagę, że niektóre terminale mogą wyświetlać znak "\ b".

#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); 
} 
Powiązane problemy