Fehler beim Lesen von binärer Datei
-
hallo,
in einem neuen Programm benutze ich zum Speichern von Einstellungen Dateien, die ich im Binärmodus schreibe und lese. Da das ganze aber nicht so funktioniert hat, wie ich das möchte, habe ich mir eine Testanwendung geschrieben, damit ich den Fehler finden kann.Hier mal der Code:
void __fastcall TForm1::Button1Click(TObject *Sender) { fstream out; out.open("C:\\test.bin",ios::out|ios::binary); time_t now; now = time(NULL); srand(now); for(int i = 0; i < 200; i++) { int zahl = rand()%0xFF;//brauche nur Zahlen kleiner 256 out.put(zahl & 0xFF); String bla; bla.sprintf("%.2x",zahl&0xFF); ListBox1->Items->Add(bla); } out.close(); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { fstream in; in.open("C:\\test.bin",ios::in|ios::binary); char c; for(int i = 0; i < 200; i++) { in.get(c); String bla; bla.sprintf("%.2x",c); ListBox2->Items->Add(bla); } in.close(); }
Nach dem Klick auf Button1 stehen in der Listbox und in der Datei die gleichen Einträge (HEX Editor). Wenn ich aber die Datei mit Button2 wieder lade, kommt es zu solchen Fehlern:
http://www.abload.de/img/binstreamxsxr.jpgKann mir jemand sagen, wie man das verhindern kann?
greetz KN4CK3R
-
ich hab jetzt nach langem debuggen rausgefunden, dass manche HEX Zeichen beim Schreiben und lesen falsch interpretiert werden.
Geschrieben wird zB 0x87 was der Zahl 135 entspricht. Wenn 0x87 eingelesen wird, wird dadraus auf einmal -121. Aber warum? Aus -121 wird dann folgerichtig FFFFFF87. Warum kommt dieser Fehler?greetz KN4CK3R
-
Liegt an "char c" in der TForm1::Button2Click. Mach mal ein "unsigned char c" daraus.
-
+gjm+ schrieb:
Liegt an "char c" in der TForm1::Button2Click. Mach mal ein "unsigned char c" daraus.
Dann wird es nimmer compilieren, weil:
basic_istream& get(char_type& _Ch);
Aber so ginge es:
int c = in.get() & 0xFF; // int_type get();
-
unsigned char geht bei .get() nicht und beim Einlesen per >> kommt es zu falschen Werten:
http://www.abload.de/img/binstream30odp.jpg
es werden 200 Testeinträge geschrieben und auch 200 wieder gelesen, trotzdem kommt es zu dem komischen Fehler am Ende.greetz KN4CK3R
-
hustbaer schrieb:
+gjm+ schrieb:
Liegt an "char c" in der TForm1::Button2Click. Mach mal ein "unsigned char c" daraus.
Dann wird es nimmer compilieren, weil:
basic_istream& get(char_type& _Ch);
Aber so ginge es:
int c = in.get() & 0xFF; // int_type get();
danke für den Tipp. Jetzt hab ich von get(char) über >> bis read alles ausprobiert und das übersehen. Werds mal testen.
Edit: habs jetzt unter verschiedenen Konstellationen getestet und es funktioniert wunderbar. Dankeschön für die Hilfe.
greetz KN4CK3R