Anzeige:
Ergebnis 1 bis 3 von 3

Thema: Binärdatei in C-Programm einbinden

  1. #1
    Registrierter Benutzer
    Registriert seit
    05.09.2001
    Beiträge
    15

    Binärdatei in C-Programm einbinden

    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:
    Code:
    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

  2. #2
    Registrierter Benutzer
    Registriert seit
    21.01.2001
    Beiträge
    157
    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 ;-)

    Code:
    #!/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()

  3. #3
    Registrierter Benutzer
    Registriert seit
    05.09.2001
    Beiträge
    15

    Thumbs up

    Super!

    Besten Dank für die schnelle Antwort -

    Dirk

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •