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


79

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


(Це питання було видалено раніше. Я знову поставив це питання, оскільки воно цінне. Я шукав саме це в Google і нічого не знайшов. Звичайно, тривіально кодувати себе, але я б заощадив кілька хвилин, якби знайшов би такий простий сценарій, тому він цінний.

Ці питання також мали багато голосів проти без особливих пояснень. Будь ласка, прокоментуйте, перш ніж голосувати проти, чому ви вважаєте, що це нецінне або погане значення.

Це питання також викликало багато плутанини щодо того, про що я запитую. Якщо щось незрозуміле, будь ласка, запитайте. Я насправді не знаю, як це зробити більш чітким. Див. Відповіді на приклади.

Крім того (після того, як поставити запитання тут), я вже маю кілька відповідей. Я просто хочу помістити / зв’язати їх тут (знову), тому що я думаю, що це може бути корисно для когось іншого, хто шукає це.)


4
Напевно, люди розуміли, що ви хочете якийсь декомпілятор або подібні речі. Ви можете перефразувати це як "читає двійковий файл і виводить декларацію C / C ++ масиву, ініціалізованого до вмісту файлу", або щось подібне.
Matteo Italia

Відповіді:


138

На Debian та інших дистрибутивах Linux за замовчуванням встановлюється (разом із vim) xxdінструмент, який, даючи -iможливість, може робити те, що ви хочете:


6
Ах приємно! Він навіть доступний у MacOSX.
Альберт

2
не мав проблем із інтеграцією xxd у рішення Visual Studio 2013 у Windows. Я використав це джерело
Spike0xff

2
Єдиною проблемою може бути те, що цей масив не є const (як і довжина). Це може змінити ситуацію на мікроконтролерах (RAM проти ПЗУ). Можливо, вам доведеться відредагувати створені файли.
Томаш Гандор,

1
@TomaszGandor: так, хоча з того, що я бачив, наприклад, на мікроконтролерах AVR, цього constбуло б недостатньо, якщо ви хочете, щоб вони залишались у флеш-пам'яті, вам слід додати специфічні для виробника атрибути ( PROGMEMу gcc); Я боюся, що такий випадок, мабуть, занадто конкретний для інструменту загального призначення, ви, мабуть, захочете написати конкретний сценарій збірки.
Matteo Italia

4
@MatteoItalia - я згоден. Я його загорнув, так що це труби, які виводяться через | sed 's/unsigned/const unsigned/', і він міг би сказати все, що вам потрібно, у цьому рядку. (Я поміщаю результат в окремий файл - для легшого перезапису).
Томаш Гандор,

6

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


Ви отримаєте зайвий "," в кінці вашого масиву символів перед "}"
rkosegi

1
Це не проблема, він компілюється на C ++.
sashoalm

4

Прийнята відповідь за допомогою інструмента xxd приємна, якщо ви перебуваєте в системі, подібній до * nix. Ось "однокласний вкладиш" для будь-якої системи, яка має python виконуваний файл на шляху:

<двійковий файл> - це ім'я файлу, який ви хочете перетворити на заголовок 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'};')

1
Я скористався цією відповіддю, а не писав свою. У ньому бракує багато форматування, і файл .h може використовувати певний захист #ifdef від багаторазового включення, але він спрацював. +1 за роботу.
cmm

0

Цей інструмент компілюється в командному рядку розробника на C. Він видає вихід на термінал, що відображає вміст у створеному файлі "array_name.c". Зверніть увагу, що деякі термінали можуть відображати символ "\ b".


0

Це двійковий файл для вихідного коду 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

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

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

Скріншот рідини


0

Я перевірив усі доступні варіанти і вирішив створити власну маленьку програму для перетворення:

https://github.com/TheLivingOne/bin2array/blob/master/bin2array.c

Він працює набагато швидше, ніж bin2c і навіть xxd, що важливо для великих файлів, особливо якщо ви хочете вбудувати перетворення у свою систему збірки. Наприклад, 50 Мб файлу на моєму комп'ютері:

bin2c.py> 20 сек

Прості сценарії Python - близько 10 сек

xxd - близько 3 сек

bin2array - близько 0,4 сек

Крім того, він видає набагато компактніший результат і додає вирівнювання масиву, якщо ви хочете помістити туди 32 або 64 бітові значення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.