Dateien binär einlesen
-
hallo
ich möchte gerne eine bilddatei binär einlesen und dann base64 kodieren. wie genau kann man mit dem C++ Builder 6 dateien binär einlesen bzw. gleich base64 kodiert?
-
scheint ein thema zu sein was in verbindung mit dem C++ builder nie wirklich diskutiert wird kann das sein? nicht einmal google findet mir relevante ergebnisse dazu. mit der FileOpen funktion kann man scheinbar dateien nicht im binär modus öffnen, nur im text modus.
-
Hallo,
Zum einlesen kannst du Standard-C++ Mittel (also streams) oder TFileStream benutzen. Beide arbeiten auch binär. Base64-Codierung gibt es von Haus aus nicht. Evtl. ist irgendwas in der Indy-Lib drin was das kann.
-
danke für den tipp und wie genau funktioniert die komponente? versucht habe ich es so:
TFileStream *File = new TFileStream("C:\\bild.jpg", fmOpenRead); char *buffer; String data; File->Seek(0, soFromBeginning); while(File->Read(buffer, 1)) data += (int)*buffer; delete File; ShowMessage(strlen(data.c_str())); Memo1->Lines->Text = data;
-
Du solltest deinem Puffer schon noch Speicher zuweisen sonst schreibst du ins Leere. Wenn du immer nur ein zeichen auslesen willst reicht hier aber auch ein char.
Es wäre aber sicher performanter alles auf einmal zu lesen und dann später zu interpretieren.TFileStream *File = new TFileStream("C:\\bild.jpg", fmOpenRead); int size(File->Size); char *buffer = new char[size]; // hier ohne 0-Byte File->Read(buffer, size); delete File; // jetzt kannst du irgendwas mit deinem buffer anstellen // delete[] buffer; später nicht vergessen
-
danke Braunstein. aber auch hier geht scheinbar nur der text modus. benutze ich "test.txt" funktioniert es (18 bytes), benutze ich "test.jpg" funktioniert es nicht, ich erhalte nur 3 bytes. wie kann ich mit TFileStream den binary modus nutzen, sehe dazu kein flag.
-
Hast du den Code so verwendet wie ich ihn gezeigt habe? TFileStream::Read liest mit Sicherheit binär. Ich denke eher, dass an deiner Auswertung liegt. Wie hast du das denn gemacht? Wie hast du festgestellt, dass es nur 3 Byte sind?
-
ja habe ich. falls ich es keinem TMemo zuweisen kann, wie kann ich es sonst "sehen"? gibt es eigentlich einen unterschied zwischen binärdateien und binärcode? wenn ja, welchen und warum? ich dachte nähmlich das binärdateien den binärcode enthalten.
TFileStream *File = new TFileStream("C:\\test.jpg", fmOpenRead); int size(File->Size); char *buffer = new char[size]; File->Read(buffer, size); Memo1->Lines->Text = buffer; ShowMessage(sizeof(buffer)); delete File; delete[] buffer;
-
gustafa schrieb:
falls ich es keinem TMemo zuweisen kann, wie kann ich es sonst "sehen"?
Entweder mit dem Debugger nachsehen, oder selbst was schreiben... Ein TMemo ist dafür jedenfalls nicht geeignet. Kann es per Definition auch gar nicht sein.
gustafa schrieb:
gibt es eigentlich einen unterschied zwischen binärdateien und binärcode?
Nö, eigentlich nicht. Es sei denn man betrachtet Code immer als ausführbaren Code.
Grüße Joe
-
okay aber warum werden mir dann nur 3 bytes mit dem sizeof operator angezeigt? es müssten eigentlich 46646 sein, welches int size enthält.
-
Hallo
Weil sizeof nicht das macht was du gerne hättest (Warum 3 angezeigt wird ist mir unklar, es sollte 4 angezeigt werden). Warum machst du es nicht einfacher?
ShowMessage(size);
bis bald
akari
-
es wird 4 angezeigt, sorry. also im puffer ist scheinbar alles vorhanden. ich dachte aber man kann mit dem sizeof operator die bytes, die ein datentyp belegt, zurückgeben. und wenn es sich um ein array handelt erreichnet sizeof doch bei angabe ohne den index-operator gleich Bytes*Anzahl = Total Bytes. oder nicht? so könnte man eigentlich mit sizeof(array) / sizeof(array[0]) = anzahl elemente?
-
Das funktioniert nur bei Arrays auf dem Stack, wo der Compiler schon zur Compiletime weiß wie groß dein Array ist. Das ist hier nicht der Fall.
und für dein MemoTFileStream *File = new TFileStream("C:\\test.jpg", fmOpenRead); int size(File->Size); char *buffer = new char[size]; File->Read(buffer, size); AnsiString text; for( size_t i=0; i<size; ++i) { text += IntToStr(int(buffer[i])); } Memo1->Lines->Text = text; ShowMessage(size); delete File; delete[] buffer;
ungetestet.