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

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


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

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

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

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

Ответы [ 6 ]

118 голосов
/ 03 января 2012

В Debian и других дистрибутивах Linux по умолчанию (вместе с vim) установлен инструмент 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;
6 голосов
/ 03 января 2012

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

#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");
}
1 голос
/ 19 июня 2019

Принятый ответ с использованием инструмента xxd хорош, если вы работаете в * nix-подобной системе. Вот «одна строка» для любой системы, в которой есть исполняемый файл python:

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>

<двоичный файл> - это имя файла, который вы хотите превратить в заголовок C, <заголовочный файл> - это имя файла заголовка, а <имя массива> - это имя, которое должен иметь массив.

Вышеприведенная однострочная команда Python выполняет примерно то же самое, что и следующая (гораздо более читаемая) программа 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'};')
0 голосов
/ 31 декабря 2018

Вопрос старый, но позвольте мне предложить простой инструмент, который можно использовать как альтернативу ...

Вы можете использовать инструмент на основе графического интерфейса, который называется Fluid.На самом деле он используется для разработки интерфейса для инструментария FLTK, но также может генерировать массив unsigned char для C ++ из двоичного файла.Загрузите его с muquit .

Fluid screenshot

0 голосов
/ 28 сентября 2018

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

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("};")
0 голосов
/ 30 ноября 2017

Этот инструмент компилируется в командной строке разработчика на 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...