Probleme beim schreiben in BMP-Datei



  • Moin,

    ich hab ein Programm geschrieben, mit dem eine Nachricht in einem Bild versteckt wird. Dafür gibt es eine Funktion "Nachricht_Verschl" mit der die vom Benutzer eingegebene Nachricht in die BMP-Datei geschrieben wird und eine Funktion "Nachricht_Entschl", die die Nachricht wieder aus der BMP-Datei liest.

    Zum Problem:

    Mein Problem ist jetzt nach dem ich alle Kontrollausgaben entfernt habe funktioniert die "Nachricht_Verschl" Funktion nicht mehr (Streamzeiger wird -1). Jetzt hab ich die einzelnen Kontrollausgaben einzeln wieder hinzugefügt und festgestellt, dass wenn die Ausgabe "Zeiger Position nach schreiben: "<< crypt_bmp.tellg()" im Code steht, das Programm halbwegs stabil läuft, aber wieso geht es nicht ohne 😕
    Und noch komischer ist, die Lese Funktion funktioniert, obwohl ich dafür einfach nur die "Nachricht_Verschl" Funktion kopiert hab und aus den write Funktionen read Funktionen gemacht habe.
    Ein weiteres Problem in diesem Zusammenhang ist, trotz Kontrollausgabe werden die Nachrichten nicht immer vollständig in die Datei geschrieben, weil plötzlich wieder der Zeiger auf die Datei den Wert -1 erhält.

    Sprich irgendetwas läuft da im Code voll gegen den Baum 🤡

    Wäre für jede Hilfe/Idee sehr dankbar 🙂

    Hier der Code, sorry geht leider nicht kürzer:

    int Nachricht_Verschl (char nachricht[500])
    {
        fstream crypt_bmp;
        crypt_bmp.open("GEHEIM.bmp", fstream:: in | fstream:: out | fstream:: binary);
        if( !crypt_bmp )
        {
            cerr << "Fehler beim oeffnen" << endl;
            return 1;
        }
    
        int zahl1, zahl2, position_zeichen, position_aktuell;
        zahl1 = 0;
        zahl2 = 0;
        position_zeichen = 0;
        position_aktuell = 0;
        crypt_bmp.seekg(54);     //Zeiger an Ende von BMP-Header setzen
    
        for(int i=0;i<strlen(nachricht);i++)
        {
            //Position für ersten Buchstaben ermitteln
            if(i == 0)
            {
                zahl1 = crypt_bmp.get();     //Berechnung wie viel Stellen weiter
                zahl2 = crypt_bmp.get();     //ein Buchstabe gespeichert werden soll
                position_zeichen = zahl1*zahl2%197;
                position_zeichen = position_zeichen%78;
    
                if(position_zeichen == 0){crypt_bmp.get();}     //3.Byte soll immer frei bleiben, daher wird ein Byte übersprungen
                    else{crypt_bmp.seekg(57+position_zeichen);} //Zeiger springt an die Prositions, wo ein Buchstabe eingesetzt wird
    
                crypt_bmp.write(&nachricht [0], 1);    //Zeichen in BMP-Datei schreiben
                cout<<"Zeiger Position nach schreiben: "<< crypt_bmp.tellg()<<endl;
            }
    
            //Position für ein Buchstaben ermitteln
            if(i%2 == 1)
            {
                zahl1 = crypt_bmp.get();     //Berechnung wie viel Stellen weiter
                zahl2 = crypt_bmp.get();     //ein Buchstabe gespeichert werden soll
                position_zeichen = zahl1*zahl2%197;
                position_zeichen = position_zeichen%78;
                position_aktuell = crypt_bmp.tellg();
    
                if(position_zeichen == 0){crypt_bmp.get();}                     //3.Byte soll immer frei bleiben, daher wird ein Byte übersprungen
                    else{crypt_bmp.seekg(position_aktuell+1+position_zeichen);} //Zeiger springt an die Prositions, wo ein Buchstabe eingesetzt wird
    
                //Zeichen in BMP-Datei schreiben
                crypt_bmp.write(&nachricht [i], 1);
                cout<<"Zeiger Position nach schreiben: "<< crypt_bmp.tellg()<<endl;
            }
    
            //Position für ein Buchstaben ermitteln
            else if(i != 0)
            {
                zahl1 = crypt_bmp.get();     //Berechnung wie viel Stellen weiter
                zahl2 = crypt_bmp.get();     //ein Buchstabe gespeichert werden soll
                position_zeichen = zahl1*zahl2%197;
                position_zeichen = position_zeichen%78;
                position_aktuell = crypt_bmp.tellg();
    
                if(position_zeichen == 0){crypt_bmp.get();}                     //3.Byte soll immer frei bleiben, daher wird ein Byte übersprungen
                    else{crypt_bmp.seekg(position_aktuell+1+position_zeichen);} //Zeiger springt an die Prositions, wo ein Buchstabe eingesetzt wird
    
                //Zeichen in BMP-Datei schreiben
                crypt_bmp.write(&nachricht [i], 1);
                cout<<"Zeiger Position nach schreiben: "<< crypt_bmp.tellg()<<endl;
            }
         }
        crypt_bmp.close();
        return 0;}
    


  • Mach ein kleines Beispiel und dann gehe mit dem Debugger Schritt für Schritt durch.


Anmelden zum Antworten