Skript / Tool zum Konvertieren einer Datei in ein C / C ++ - Quellcode-Array

78

Ich benötige ein Skript / Tool, das eine Binärdatei liest und ein C / C ++ - Quellcode-Array ausgibt (das den Dateiinhalt darstellt). Sind da welche?


(Diese Frage wurde früher gelöscht. Ich habe diese Frage wieder eingefügt, weil sie wertvoll ist. Ich habe bei Google genau danach gesucht und nichts gefunden. Natürlich ist es trivial, mich selbst zu codieren, aber ich hätte einige Minuten gespart, wenn ich hätte ein so einfaches Skript gefunden. Somit ist es wertvoll.

Diese Fragen hatten auch viele Abstimmungen ohne viel Erklärung. Bitte kommentieren Sie, bevor Sie abstimmen, warum Sie der Meinung sind, dass dies keinen oder einen schlechten Wert hat.

Diese Frage verursachte auch viel Verwirrung darüber, worüber ich frage. Wenn etwas unklar ist, fragen Sie bitte. Ich weiß nicht wirklich, wie ich es klarer machen soll. Beispiele finden Sie in den Antworten.

Auch (nachdem ich die Frage hier gestellt habe) habe ich bereits mehrere Antworten. Ich möchte sie nur (wieder) hier einfügen / verlinken, weil ich denke, dass es für jemanden nützlich sein könnte, der danach sucht.)

Albert
quelle
4
Wahrscheinlich haben die Leute verstanden, dass Sie eine Art Dekompiler oder ähnliches wollten. Sie können es umformulieren als "liest eine Binärdatei und gibt eine C / C ++ - Deklaration eines Arrays aus, das mit dem Inhalt der Datei initialisiert wurde" oder so ähnlich.
Matteo Italia

Antworten:

135

Unter Debian und anderen Linux-Distributionen ist standardmäßig (zusammen mit vim) das xxdTool installiert , das mit der -iOption tun kann, was Sie wollen:

Matteo Italia
quelle
6
Ah schön! Es ist sogar in MacOSX verfügbar.
Albert
2
Ich hatte keine Probleme, xxd in eine Visual Studio 2013-Lösung unter Windows zu integrieren. Ich habe diese Quelle benutzt
Spike0xff
2
Das einzige Problem könnte sein, dass dieses Array nicht const (sowie die Länge) ist. Dies kann bei Mikrocontrollern (RAM vs ROM) einen Unterschied machen. Möglicherweise müssen Sie die generierten Dateien bearbeiten.
Tomasz Gandor
1
@TomaszGandor: Ja, obwohl nach dem, was ich auf zB AVR-Mikrocontrollern gesehen habe const, nicht ausreichen würde, müssen Sie herstellerspezifische Attribute ( PROGMEMin gcc) hinzufügen, wenn Sie möchten, dass sie im Flash-Speicher bleiben . Ich befürchte, dass ein solcher Fall wahrscheinlich zu spezifisch für ein Allzweck-Tool ist. Sie werden wahrscheinlich ein bestimmtes Build-Skript schreiben wollen.
Matteo Italia
3
@ MattoItalia - ich stimme zu. Ich habe es verpackt, so dass die Ausgabe durchgeleitet wird | sed 's/unsigned/const unsigned/', und es könnte alles sagen, was Sie in dieser Zeile brauchen. (Ich habe das Ergebnis in eine separate Datei eingefügt - damit es leicht überschrieben werden kann).
Tomasz Gandor
6

Ein einfaches Tool finden Sie hier :

Albert
quelle
Sie haben extra "," am Ende Ihres char-Arrays vor "}"
rkosegi
1
Das ist kein Problem, es wird in C ++ kompiliert.
Sashoalm
4

Die akzeptierte Antwort mit dem xxd-Tool ist hilfreich, wenn Sie sich auf einem * nix-ähnlichen System befinden. Hier ist ein "Einzeiler" für jedes System, auf dessen Pfad Python ausführbar ist:

<Binärdatei> ist der Name der Datei, die Sie in einen C-Header umwandeln möchten, <Headerdatei> ist der Name der Headerdatei und <Arrayname> ist der Name, den das Array haben soll.

Der obige einzeilige Python-Befehl entspricht in etwa dem folgenden (viel besser lesbaren) Python-Programm:

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'};')
Astraujums
quelle
1
Ich habe diese Antwort verwendet, anstatt meine eigene zu schreiben. Es fehlt viel Formatierung, und die .h-Datei könnte einen # ifdef-Schutz gegen Mehrfacheinschluss verwenden, aber es hat funktioniert. +1 für die Arbeit.
cmm
0

Dieses Tool wird in der Entwickler-Eingabeaufforderung in C kompiliert. Es erzeugt eine Ausgabe an das Terminal und zeigt den Inhalt in der erstellten Datei "array_name.c" an. Beachten Sie, dass einige Terminals möglicherweise das Zeichen "\ b" anzeigen.

m_h
quelle
0

Dies ist eine Binärdatei für den Python-Quellcode des C-Array-Generators, die in Alberts Antwort mit dem Programm identisch ist .

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("};")
Hügel
quelle
0

Die Frage ist alt, aber lassen Sie mich ein einfaches Werkzeug vorschlagen, das als Alternative verwendet werden kann ...

Sie können das GUI-basierte Tool Fluid verwenden. Es wird tatsächlich zum Entwerfen einer Schnittstelle für das FLTK-Toolkit verwendet, kann jedoch auch ein vorzeichenloses Zeichenarray für C ++ aus einer Binärdatei generieren. Laden Sie es von muquit herunter .

Flüssiger Screenshot

WailenB
quelle
0

Ich habe alle verfügbaren Optionen überprüft und beschlossen, mein eigenes kleines Programm für die Konvertierung zu erstellen:

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

Es funktioniert viel schneller als bin2c und sogar xxd, was für größere Dateien wichtig ist, insbesondere wenn Sie die Konvertierung in Ihr Build-System einbetten möchten. ZB für 50 Mb Datei auf meinem Computer:

bin2c.py> 20 Sek

Einfache Python-Skripte - ca. 10 Sek

xxd - ungefähr 3 Sek

bin2array - ca. 0,4 Sek

Außerdem wird eine viel kompaktere Ausgabe erzeugt und dem Array eine Ausrichtung hinzugefügt, falls Sie dort 32- oder 64-Bit-Werte einfügen möchten.

Sergey Galin
quelle