Datei binär speichern

Alles rund um die Programmierung mit Qt
Antworten
toem
Beiträge: 124
Registriert: 17. März 2009 14:01

Datei binär speichern

Beitrag 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=
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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...
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag 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 ...
toem
Beiträge: 124
Registriert: 17. März 2009 14:01

Beitrag 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)
???
Antworten