Bildverschlüsselung schlägt fehl, wieso?
-
Hallo. Ich hatte vor, eine Bilddatei einzulesen, sie dann mittels XOR zu verschlüsseln. Hat nicht geklappt. Woran liegt es, dass
strName.writenicht funktioniert? (Bin Anfänger) Compiler meldet an der Schreibstelle einen sog. "Assertion failure - INVALID NULL POINTER".??
#include <iostream> #include <fstream> using namespace std; #define MAX 4096 const char* const pFILENAME = "images.jpg"; int main() { char buf[MAX]; fstream strName(pFILENAME ,ios::binary|ios::in|ios::out); if (!strName) { cout << "Fehler beim Öffnen der Datei " << pFILENAME << endl; return 1; } for(int i = 0; i < MAX; ++i) { if(!strName.eof()) { strName.read(buf,MAX); } } cout << buf; for(int i = 0; i < MAX; ++i) { buf[i] ^= buf[i+1]; } cout << buf; for(int i = 0; i < MAX; ++i) { strName.write(reinterpret_cast<const char*>(buf[i]),MAX); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< } cout << buf; strName.close(); cin.get(); }PS.: Ich bin mir bewusst, dass das womöglich nicht mein einziger Fehler ist. Bin für jeden Vorschlag dankbar.
Gruß, skullyan.
-
ein ziechen ist nicht 4096 stück
-
dddddd schrieb:
ein ziechen ist nicht 4096 stück
Soll aber die ganze Datei auslesen. Die ist 4 kB groß.
-
skullyan schrieb:
dddddd schrieb:
ein ziechen ist nicht 4096 stück
Soll aber die ganze Datei auslesen. Die ist 4 kB groß.
Du hast aber das Schreiben als Fehler angegeben, nicht das lesen.
-
Warum machst du es beim write nicht genau so wie beim read? Dann sollte das Schreiben funktionieren.
Lars
-
manni66 schrieb:
Warum machst du es beim write nicht genau so wie beim read? Dann sollte das Schreiben funktionieren.
Lars
Wobei natürlich auch beim read die for-Schleife sinnfrei ist.
Lars
-
Du verwandelst die Adresse jedes der 4096 Zeichen in buf in einen char* und übergibst den an write. Das führt dazu, dass er von jedem Zeichen ausgehend die nächsten 4096 Zeichen schreibt, was nur beim 1. Zeichen funktioniert.
Nimm einfachstrName.write(buf,MAX);(ohne Schleife drumrum).
Oder du beschäftigst dich noch mal genauer mit den Ein-/Ausgabefunktionen.
-
skullyan schrieb:
strName.write(reinterpret_cast<const char*>(buf[i]),MAX);Mal abgesehen von dem, was die anderen schon gesagt haben: für mich sieht dein Cast nicht ganz richtig aus. Ich gehe mal davon aus, dass du eigentlich &buf[i] oder buf+i casten wolltest. Dann hättest du nämlich die Adresse des i. Elementes. So wie du es hier machst, castest du das Byte (also den Inhalt) an dieser Positionen als Pointer. Ist das Byte mal schwarz (also 0) hast du deinen 0-Pointer. Abgesehen davon dürfte dich dieser Cast an interessante Stellen im Speicher führen...
-
Meint ihr so?
#include <iostream> #include <fstream> using namespace std; #define MAX 4096 const char* const pFILENAME = "images.jpg"; int main() { char buf[MAX]; fstream strName(pFILENAME ,ios::binary|ios::in|ios::out); if (!strName) { cout << "Fehler beim Öffnen der Datei " << pFILENAME << endl; exit (1); } if(!strName.eof()) { strName.read(buf,MAX); } cout << buf; for(int i = 0; i < MAX; ++i) { buf[i] ^= buf[i+1]; } cout << buf; strName.write(buf,MAX); cout << buf; strName.close(); cin.get(); }Gibt zwar keinen Fehler mehr, aber Schreiben geht trotzdem nicht.
-
ipsec schrieb:
Du verwandelst die Adresse jedes der 4096 Zeichen in buf in einen char* und übergibst den an write.
Nein, jedes Zeichen wird in eine Addresse gecastet.
reinterpret_cast<const char*>(buf[i])1.) Lass doch einfach mal das scheiss reinterpret_cast weg, wenn du keine Ahnung hast, was es macht.
2.) if (!strName.eof()) .. tja du hast doch die Datei gerade bis zum ende gelesen. Also ist er am Ende der Datei und der Befehl nach dem if wird nicht ausgefuehrt. Auch waere es vielleicht von Vorteil, nicht die alte Bilddatei zu veraendern.
-
knivil schrieb:
ipsec schrieb:
Du verwandelst die Adresse jedes der 4096 Zeichen in buf in einen char* und übergibst den an write.
Nein, jedes Zeichen wird in eine Addresse gecastet.
reinterpret_cast<const char*>(buf[i])1.) Lass doch einfach mal das scheiss reinterpret_cast weg, wenn du keine Ahnung hast, was es macht.
2.) if (!strName.eof()) .. tja du hast doch die Datei gerade bis zum ende gelesen. Also ist er am Ende der Datei und der Befehl nach dem if wird nicht ausgefuehrt. Auch waere es vielleicht von Vorteil, nicht die alte Bilddatei zu veraendern.Der scheiß Cast ist weg.
-
knivil schrieb:
ipsec schrieb:
Du verwandelst die Adresse jedes der 4096 Zeichen in buf in einen char* und übergibst den an write.
Nein, jedes Zeichen wird in eine Addresse gecastet.
Stimmt, hab ich glatt übersehen

Wie auch immer, du solltest dich wirklich mal intensiver mit IO beschätigen.
-
Was mache ich denn hier genau falsch?
-
Ps.: Wenn ich ein neues Stream-Objekt anlege, funktioniert das Schreiben.