скрипт / инструмент для преобразования файла в массив исходного кода C / C++
Мне нужен скрипт / инструмент, который читает двоичный файл и выводит массив исходного кода C/C++ (который представляет содержимое файла). А они есть?
(этот вопрос был удален ранее. Я возвращаю этот вопрос, потому что он ценен. Я искал именно это в Google и ничего не нашел. Конечно, это тривиально кодировать себя, но я бы сэкономил несколько минут, если бы нашел такой простой скрипт. Таким образом, это ценно.
этот вопросы также имели много голосов вниз без особых объяснений. Пожалуйста, прокомментируйте, прежде чем вы проголосуете, почему вы думаете, что это не имеет никакой ценности или плохой ценности.
этот вопрос также вызвал много путаницы в том, о чем я спрашиваю. Если что-то непонятно, пожалуйста, спрашивайте. Я действительно не знаю, как сделать это более ясным. См. ответы для примеров.
кроме того (после постановки вопроса здесь), у меня уже есть несколько ответов. Я просто хочу поставить / связать их здесь (снова), потому что я думаю, это может быть полезно для кого-то поиск для этого.)
4 ответа:
на Debian и других дистрибутивах Linux устанавливается по умолчанию (вместе с
vim
) thexxd
инструмент, который, учитывая-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("};")