Hex-Dump einer Datei in eine andere schreiben

shutdown

Erfahrenes Mitglied
Hallo!

Ich hätt da mal wieder gern a Problem :)

Und zwar versuche ich zur Zeit, in C++ den Hexa-Dezimal-Dump einer Datei zu erzeugen.
Das funktioniert auf der Konsolenansicht auch wunderbar (Beispiel folgt).

Nur wenn es nun darum geht, die selbe Ausgabe auch in eine Datei zu bekommen, dann weiß ich nicht mehr so recht, wie ich das machen soll.

Hier mal der gesamte Code:

Code:
#include <iostream.h>
#include <fstream.h>

void main(void)
{
    ifstream dump;
    ofstream dump_out;

    char dump_pfad[100];
    char ausgabe_pfad[100];

    cout << "Hex-Dump einer Datei\n";
    cout << "--------------------\n\n";

    cout << "Pfad der Datei angeben: ";
    cin >> dump_pfad;

    cout << "Pfad der Ausgabe-Datei angeben: ";
    cin >> ausgabe_pfad;


    dump.open(dump_pfad, ios::nocreate);

    if(!dump)
        cout << "\nDatei nicht gefunden oder fehlende Zugriffsrechte";
    else
    {
        char nxt_ch;    //nächster Charakter
        int  nr_ch=0;     //Zahl des Charakter

        cout << hex;    //Hexa-Ausgabe

        int speicher;

        dump_out.open(ausgabe_pfad);

        while(dump.get(nxt_ch))
        {


            if(nr_ch % 16 == 0)
            {
                cout << "\n";
        		    cout.width(6);
                cout << hex << nr_ch << " ";
            }

            cout.width(3);

        		cout << int(nxt_ch);

            speicher = int(nxt_ch);
            dump_out.put(speicher);

            nr_ch++;
        }
    }

    dump.close();
    dump_out.close();
}

Eine Datei mit Inhalt "123abc" erzeugt damit folgende Hexa-Anzeige:

Code:
0  31 32 33 61 62 63

0 ist die Zahl des ersten Elements einer Zeile (vergleichbar mit Speicheradressierung)


Und hier kommt nun der Abschnitt des Codes, der mir Probleme macht:

Code:
speicher = int(nxt_ch);
dump_out.put(speicher);

Mache ich aus Speicher eine char-Variable, dann kopiert er mir die Datei 1 zu 1
Ist Speicher aber eine int-Variable, dann krieg ich die Fehlermeldung:

Code:
"Ambiguity between 'ostream::put(char)' and 'ostream::put(signed char)'   "
Weiß hier jemand Rat?

Vielen Dank schon mal im Voraus!

shutdown
 
Da du die Ausgabe in die Datei ja nicht binär, sondern als normalen Text machen möchtest, kannst du einfach den <<-Operator verwenden (genauso wie bei cout). Beispiel, ohne Gewähr:

Code:
dump_out <<  hex << nirgendein_wert << " ";
In deinem Code hast du das mit cout ja schon gemacht -- für die Datei funktioniert es genauso.
 
Danke für die Antwort!

Nur leider funktionierts nicht so einfach.

Er bringt zwar keine Fehlermeldungen wenn ich mit << in die Outputstream schreibe, er erstellt die Datei aber auch nicht.

Damit ich weiterhin 2 Probleme:

1) Mit dump_out << "\n"; wird keine Datei erstellt.
2) Ich habe jetzt meinen Code etwas erweitert, so dass die Darstellung schon einem gewöhnlichen Hex-Editor recht nahe kommt. Ich hab jetzt einfach mal alle \n durch ein Zeichen ^ ersetzten lassen, um mir Zeilenumbrüche in der Ausgabe zu ersparen. Das funktioniert bei Textdateien auch sehr gut. Wenn ich dann aber andere Formate einlesen will, z.B. .bak, .c, .doc dann scheint es doch noch ein paar mehr Zeichen zu geben, die einen Zeilenumbruch verursachen. Wie schalt ich das ab?

Ihr könnt es ja mal ausprobieren. Hier mein abgewandelter Code inkl. dem dump_out <<

Code:
#include <iostream.h>
#include <fstream.h>
#include <string.h>

void main(void)
{
    ifstream dump;
    ofstream dump_out;

    char dump_pfad[100];
    char ausgabe_pfad[100];

    cout << "Hex-Dump einer Datei\n";
    cout << "--------------------\n\n";

    cout << "Pfad der Datei angeben: ";
    cin >> dump_pfad;

    cout << "Pfad der Ausgabe-Datei angeben: ";
    cin >> ausgabe_pfad;


    dump.open(dump_pfad, ios::nocreate);

    if(!dump)
        cout << "\nDatei nicht gefunden oder fehlende Zugriffsrechte";
    else
    {
        char nxt_ch;    //nächster Charakter
        int  nr_ch=0;     //Zahl des Charakter

        cout << hex;    //Hexa-Ausgabe

        char ch_arr[20];

        for(int i=0; i<=20; i++)
            ch_arr[i] = '\0';

        char speicher[2];


       // int speicher;

        dump_out.open(ausgabe_pfad);

        while(dump.get(nxt_ch))
        {

            if(nr_ch == 0)
            {
                cout.width(6);
                cout.fill('0');
                cout << hex << nr_ch << " ";

                dump_out << hex << nr_ch << " ";
            }

            if((nr_ch % 16 == 0) && !(nr_ch == 0))
            {
                cout << "\n";
        		    cout.width(6);
                cout.fill('0');
                cout << hex << nr_ch << " ";

                dump_out << "\n" << hex << nr_ch << " ";
            }

            cout.width(3);
            cout.fill(' ');

        		cout << hex << int(nxt_ch);

            dump_out << hex << int(nxt_ch);
            
            speicher[0] = nxt_ch;
            speicher[1] = '\0';

            if(speicher[0] == '\n')
				    strcpy(speicher, "^");

            strcat(ch_arr, speicher);


            if(ch_arr[15] != '\0')
            {
                cout << " |" << ch_arr << "|";

                dump_out << " |" << ch_arr << "|";

                for(int i=0; i<=20; i++)
                    ch_arr[i] = '\0';
            }


         //   speicher = int(nxt_ch);
         //   dump_out.put(speicher);

            nr_ch++;
        }

        if(nr_ch % 16 != 0)
        {
             int wert = 16 - (nr_ch % 16);

             for(wert; wert > 0; wert--)
             {
                 cout.width(3);
                 cout.fill(' ');
                 cout << "00";

                 dump_out << "00";
             }

             cout << " |" << ch_arr << "|";

             dump_out << " |" << ch_arr << "|";

             ch_arr[0] = '\0';

        }


    }

    dump.close();
    dump_out.close();
}

cu shutdown
 
Zurück