PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Binärdatei in C-Programm einbinden



stieler
04-03-2002, 07:51
Hallo C-Programmierer,

ich habe eine Binärdatei, die ich in meinem C-Programm lade und deren Daten dann verarbeite.

Aus zwingenden Gründen kann ich nun aber die Datei nicht mehr zur Laufzeit laden, ich muß die Daten zur Compiler-/Linkerzeit in das Programm mit einbinden.
Wie kann ich das am besten machen?

Eine Lösung habe ich selbst schon gefunden: Ich erzeuge folgende Datei:


unsigned char Daten[] = "Hier stehen die Binärdaten";

Anführungszeichen und "\ " werden natürlich durch ein führendes "\" ergänzt. Diese Datei binde ich dann mit #include ein.
Aber geht es nicht auch direkter, ohne den Umweg über eine extra Datei?

Danke -

Dirk

jgbauman
04-03-2002, 11:37
Um das erzeugen einer extra Date kommt man wohl nicht herum, sei es .h .c .o .s oder .a . Am portabelsten ist immer noch C-code zu erzeugen. Folgendes Skript (python >= 2.0) erzeugt aus mit
<b>bin2c.py test.data</b>
test_data.h und test_data.c mit dem const char* test_data, das auf die Daten zeigt.
Eine passende Regel ins Makefile und schon geht alles (fast) automatisch ;-)


#!/usr/bin/env python

import sys, re, traceback

def genH(s):
h = open("%s.h"%s, "w")
print >>h, """#ifndef %s_H\n#define %s_H\n\nextern const char* %s;\n\n#endif /* %s_H*/"""%(s.upper(), s.upper(), s, s.upper())

def genC(s, binary):
c = open("%s.c"%s, "w")
print >>c, '#include "%s.h"\n\nconst char* %s = '%(s, s),
while 1:
data = binary.read(18);
if len(data) == 0: break
print >>c, '\n "%s"'%"".join(map(lambda x:r"\x%02x"%(ord(x)), data)),
print >>c, ";"

for filename in sys.argv[1:]:
print "processing %s ..."%filename
try:
cname = re.sub(r"\W", "_", filename)
try:
binary = open(filename, "rb")
except:
print >>sys.stderr, "Error, could not open file: %s"%filename
continue

genH(cname);
genC(cname, binary);
except:
traceback.print_exc()

stieler
04-03-2002, 12:20
Super!

Besten Dank für die schnelle Antwort -

Dirk