binäre datei in ascii wandeln und wieder zurück



  • Hallo liebe C++ler,

    Einleitung:

    Wir betreiben in unserem gemeinnützigen Verein knappe 185 Router, um die Haushalte mit DSL per Funk zu versorgen. Das läuft seit Jahren perfekt. Nun müssen wir demnächst an der Konfiguration einige Parameter ändern. Also per http in den Router einlogen, Änderungen machen, speichern - nächster Router. Da hat man Wochen zu tun, weil schon durch die IP Adressen jeder Router anders konfiguriert ist. Daher die Idee, die Konfigurationsdatei offline zu erzeugen und dann nur noch per Restore Funktion des Routers hochzuladen. Die Konfigurationsdatei ist eine binäre Datei, in der jeweils einer Variablen ein Wert zugeordnet ist. Ich muß nun ein Programm schreiben, was eine vorgefertigte binäre Datei in eine ASCII Datei umwandelt. In der ASCII Datei möchte ich dann z.B. IP Adresse, Username, Passwort u.s.w. per PHP Script aus einer MySQL Datenbank ersetzen. Ich habe dann für jeden Router eine ASCII Konfigurationsdatei. Nun muß jede Datei wieder in das Binärformat umgewandelt werden. Ich habe einen Rechner mit Debian 6.0.6 (32 Bit) mit Development Tools und Libraries zur Verfügung, auf welchem ich das C++ Programm laufen lassen möchte.

    Aufgabe:

    Die binäre Default Datei befindet sich hier: https://www.dropbox.com/s/6qurhw091194cas/defaults.bin

    Das ist hier mein erster Versuch, die binäre Datei zu lesen:

    #include <iostream>
    #include <fstream>
    #include <vector>
    #include <string>
    #include <iterator>
    
    using namespace std;
    ifstream FileIn("defaults.bin");
    
    if (FileIn)     // Falls FileIn existiert
    {
        vector<string> Contents;              // Container f. einzelnen Zeilen
    
        // Solange kein Fehler auftritt und nicht eof
        for (string ReadString; getline(FileIn, ReadString); )
            Contents.push_back(ReadString);   // Aktuelle Zeile in den Vektor einfuegen
        // Alle Elemente des Vektors ausgeben.
        ostream_iterator<string> Out(cout, "\n");
        copy(Contents.begin(), Contents.end(), Out);
    }
    

    leider mit dem Ergebnis:

    # g++ -o decode decode.c 
    decode.c:12: error: expected unqualified-id before 'if'
    

    Aufgeben kommt nicht in Frage. Wie kann ich zum Ziel gelangen?
    Ich brauche ja nur zwei Programme: bin2ascii und ascii2bin

    lg
    Frank



  • Dann lerne erstmal (was haben wir hier?, ah) C++.

    Weißt du was main ist (bei C/C++)?



  • Wo ist die Spezifikation für dieses Binärformat?



  • Es geht wohl schneller die Router per Hand zu konfigurieren, als dass das Programm fehlerfrei läuft.



  • Okay, stimmt. Main-Funktion fehlt.

    Habe hier https://www.dropbox.com/s/80b8veo3aobi4vd/defaults.c den originalen C-Quellcode, der die defaults.bin liest. Die Funktion dazu befindet sich am Ende der Datei (Zeile 2879). Davor sind die Parameter.

    Ggf. würde es auch genügen, wenn ich ein Programm bastel, was die defaults.c includiert und ich dann dem Programm z.B. 'make_config' nur die zu überschreibenden Variablen und Werte (-p) übergebe:

    # ./make_config -o config.bin -p lan_ipaddr=192.168.10.25 wan_dns=8.8.8.8
    

    -o wäre dann der Name der fertigen Konfigdatei.

    lg
    Frank


Anmelden zum Antworten