скрипт / инструмент для преобразования файла в массив исходного кода C / C++


Мне нужен скрипт / инструмент, который читает двоичный файл и выводит массив исходного кода C/C++ (который представляет содержимое файла). А они есть?


(этот вопрос был удален ранее. Я возвращаю этот вопрос, потому что он ценен. Я искал именно это в Google и ничего не нашел. Конечно, это тривиально кодировать себя, но я бы сэкономил несколько минут, если бы нашел такой простой скрипт. Таким образом, это ценно.

этот вопросы также имели много голосов вниз без особых объяснений. Пожалуйста, прокомментируйте, прежде чем вы проголосуете, почему вы думаете, что это не имеет никакой ценности или плохой ценности.

этот вопрос также вызвал много путаницы в том, о чем я спрашиваю. Если что-то непонятно, пожалуйста, спрашивайте. Я действительно не знаю, как сделать это более ясным. См. ответы для примеров.

кроме того (после постановки вопроса здесь), у меня уже есть несколько ответов. Я просто хочу поставить / связать их здесь (снова), потому что я думаю, это может быть полезно для кого-то поиск для этого.)

4 58

4 ответа:

на Debian и других дистрибутивах Linux устанавливается по умолчанию (вместе с vim) the xxd инструмент, который, учитывая -i вариант, может делать то, что вы хотите:

matteo@teodeb:~/Desktop$ echo Hello World\! > temp
matteo@teodeb:~/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;

один простой инструмент, который можно найти здесь:

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

этот инструмент компилируется в командной строке разработчика в C. Он производит вывод на терминал, отображающий содержимое в " array_name.c " файл, который создается. Обратите внимание, что некоторые терминалы могут отображать символ "\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);
}

это двоичный файл для генератора массива C исходный код python, который является идентичной программой в Альберт.

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("};")