Ich habe eine Binärdatei, die ich (vorübergehend zu Testzwecken) in meinen C-Quellcode aufnehmen möchte, damit ich den Dateiinhalt als C-String erhalten kann.
\x01\x02\x03\x04
Ist das möglich, vielleicht mit den Hilfsprogrammen od
oder hexdump
? Auch wenn dies nicht erforderlich ist, wäre es noch angenehmer, wenn die Zeichenfolge alle 16 Eingabebytes in die nächste Zeile umgebrochen und am Anfang und Ende jeder Zeile doppelte Anführungszeichen verwendet werden könnte.
Mir ist bekannt, dass die Zeichenfolge eingebettete Nullen ( \x00
) enthält. Daher muss die Länge der Zeichenfolge im Code angegeben werden, damit diese Bytes die Zeichenfolge nicht vorzeitig beenden.
Antworten:
Sie können fast tun, was Sie wollen
hexdump
, aber ich kann nicht herausfinden, wie man Anführungszeichen und einzelne Backslashes in die Formatzeichenfolge bekommt. Also mache ich eine kleine Nachbearbeitung mitsed
. Als Bonus habe ich auch jede Zeile um 4 Leerzeichen eingerückt. :)Bearbeiten
Wie Cengiz Can hervorhob, kommt die obige Befehlszeile mit kurzen Datenleitungen nicht gut zurecht. Also hier ist eine neue verbesserte Version:
Wie Malvineous in den Kommentaren erwähnt, müssen wir auch die
-v
Option verbose übergeben, umhexdump
zu verhindern, dass lange Reihen identischer Bytes mit abgekürzt werden*
.quelle
-v
Option hinzufügenhexdump
, sonst verursachen lange Läufe des gleichen Eingangsbytes Ausgangsleitungen, die sagen"*"
.xxd
hat einen Modus dafür. Die-i
/--include
Option wird:Sie können das in eine Datei speichern, die
#include
d sein soll, und dannfoo
wie jedes andere Zeichenarray darauf zugreifen (oder es einbinden). Es enthält auch eine Deklaration der Länge des Arrays.Die Ausgabe wird auf 80 Bytes umbrochen und sieht im Wesentlichen so aus, wie Sie es von Hand schreiben könnten:
xxd
ist seltsamerweise Teil dervim
Distribution, also haben Sie sie wahrscheinlich schon. Wenn nicht, erhalten Sie es hier - Sie können das Tool auch selbst aus demvim
Quellcode erstellen .quelle
objcopy
wäre besserobjcopy
OP die Binärdaten mit der ausführbaren Datei als Objektdatei verknüpfen. Dies ist nützlich, aber nicht genau das, was hier abgefragt wird.foo
/foo_len
hier, und Sie würden nicht viel Speicherplatz verschwenden. Ich bin überzeugt, dass es dem OP besser gehtobjcopy
und dass es seinen Anforderungen entspricht.objcopy
ist in Ordnung, wenn es um ist, aber es ist nicht portabel und die Ausgabe noch weniger. Es kann sicherlich Teil einer guten dauerhaften Lösung sein, aber das ist hier nicht die Frage.xxd
ist gut, aber das Ergebnis ist sehr ausführlich und nimmt viel Speicherplatz in Anspruch.Mit können Sie praktisch dasselbe erreichen
objcopy
. z.BVerlinken Sie dann
foo.o
zu Ihrem Programm und verwenden Sie einfach die folgenden Symbole:Dies ist kein String-Literal, aber es ist im Wesentlichen dasselbe wie das, was aus einem String-Literal während der Kompilierung wird (bedenken Sie, dass String- Literale zur Laufzeit tatsächlich nicht vorhanden sind; in der Tat gibt Ihnen keine der anderen Antworten ein String-Literal auch zur Kompilierungszeit) und können auf die gleiche Weise aufgerufen werden:
Der Nachteil ist, dass Sie Ihre Zielarchitektur angeben müssen, um die Objektdatei kompatibel zu machen. Dies ist in Ihrem Build-System möglicherweise nicht trivial.
quelle
Sollte genau das sein, wonach Sie gefragt haben:
quelle
Dies ist ein kurzes Dienstprogramm, das ich geschrieben habe und das im Wesentlichen dasselbe tut (ursprünglich auf Stack Overflow gepostet ):
quelle
Wenn Sie sich für Python interessieren, laden Sie es in eine Variable "buff" und verwenden Sie so etwas wie Folgendes:
quelle