Seite 1 von 1

Datei binär speichern

Verfasst: 15. Dezember 2009 07:17
von toem
Hallo,

ich speichere momentan die Binärdaten einer beliebigen Datei in die DB, um bei Verlust der Datei diese wieder herstellen zu können. Hierzu verwende ich den folgenden Code:

Code: Alles auswählen

QString theData;
    using namespace std;
    ifstream is;
    is.open(theDoc.toLocal8Bit(), ios::binary);
    char ch;
    while (is.get(ch))
    {
        theData += ch;
    }
    theData += "\r\n";
Jetzt ist mir leider dabei folgendes aufgefallen. Ein Originalteil des Codes einer Tif-Datei sieht beispielsweise so aus:

Code: Alles auswählen

II* øK ¤?àP8$
„BaP¸d6ˆDbQ8¤V-¼A˜äv=

Verfasst: 15. Dezember 2009 09:22
von solarix
1. In der Doku zu QString steht
The QString class provides a Unicode character string
klingt das nach "binären Daten"?

2. Byte für Byte ist ineffizient..

3. Wozu dieses "\r\n"?

4. Warum mit der STL und nicht mit Qt?

Code: Alles auswählen

   QByteArray theData;
   QFile is(theDoc);
   if (is.open(QIODevice::ReadOnly))
     theData = is.readAll();
hth...

Verfasst: 15. Dezember 2009 10:02
von RHBaum
Kennt deine DB keine BLOBs ?
Binaerdaten in nen String abzuspeichern kann u.u. gefaehrlich sein, wenn irgendwer in der Kette meint korrekturen vornehmen zu muessen (windows crlf in lf umwandeln, am ende 0 zeichen anfuegen) . Kodierungen koennen noch ein problem sein.
Weiterhin, wenn 0 zeichen mitten im Block auftauchen, darf deine Stringbasierende loesung ned vom Stringende ausgehen.

Manchmal muss man aber Binaerdaten in strings verpacken ... dann wandelt man die aber nach nen schema um, wo man mit stringfunktionen ned durcheinander kommt.
Base64 ist da ein Stichwort.

Ciao ...

Verfasst: 15. Dezember 2009 10:24
von toem
Danke Danke

Ich hab aber leider grade die Vorgabe bekommen das via QFile und QByteArray zu machen. Desweiteren soll in 64k Blöcken gespeichert werden. Bislang bin ich da bis:

Code: Alles auswählen

        QFile file("myPic.tif");
        file.open(QIODevice::ReadOnly)
        int fileLen = file.bytesToWrite();
        QByteArray theData;
        theData.resize(fileLen);
        while (!file.atEnd())
        {
            theData += file.read(64);
        }
Frage hierzu. Ist der Weg so korrekt? Und wie wandel ich das ByteArray um in einen String?
Reicht da

Code: Alles auswählen

QString s(theData)
???