2017-12-11 3 views
0

In einem Projekt muss ich binäre Daten aus einer Datei lesen und unter Verwendung gzip dekomprimieren. Problem ist, dass QFile::readAll() nicht wirklich alle Bytes liest oder irgendeinen Fehler meldet.Nicht alle Binärdaten aus Datei lesen

Hier ist mein Code:

QFile ifile("/tmp/currentAlmanac.gz"); 
qDebug() << "File Size:" << ifile.size(); 

ifile.open(QIODevice::ReadOnly); 
QByteArray data = ifile.readAll(); 
ifile.close(); 
qDebug() << "Almanac Size:" << data.size(); 

Die Ausgabe lautet:

Dateigröße: 78.637
Almanac Größe: 78281

Gibt es etwas, was ich falsch mache?

Es gibt viel freien RAM.

Specs: Qt5.10 auf Ubuntu16.04

+2

Haben Sie versucht, den Inhalt der Datei zu überprüfen? Die Dateigröße auf dem Datenträger und seine tatsächlichen Bytes können je nach Dateisystem, Datenträgerkomprimierung usw. unterschiedlich sein. – Azeem

+0

@Azeem Ich muss es dekomprimieren, und die ursprüngliche Dateidekomprimierung funktioniert, während dem QByteArray einige Daten fehlen. Ich habe versucht, den Almanach erneut von der NASA herunterzuladen, zu dekomprimieren und zu komprimieren. Ich bin zu 99,9% sicher, dass der Inhalt in Ordnung ist. –

+2

Fehlen einige Daten? Wie haben Sie das verifiziert? – Azeem

Antwort

0

brauche ich binäre Daten aus einer Datei

ich habe nicht viel Erfahrung mit Qt zu lesen, aber es ist einfach genug Um große Binärdateien in den Speicher zu lesen, können Sie diese in gzip dekomprimieren. Du könntest so etwas versuchen. Verwenden Sie einen Container wie std::deque, um die Datei in Arbeitsspeicher zu speichern, da es groß ist und nicht in zusammenhängendem Speicherplatz wie einem std::vector reserviert werden muss.

// set the chunk size to be the maximum I/O unit for your machine* 
const size_t chunk_size = static_cast<size_t>(32768); 
std::deque<uint8_t> bytes; // store the whole file 
std::vector<uint8_t> chunk(chunk_size, 0); // temporary file chunk 

std::ifstream dataFile; 
dataFile.open(fileName.c_str(), std::ios::in | std::ios::binary); 

if (dataFile.is_open()) 
{ 
    // read entire file large chunks at a time 
    while (dataFile.read(reinterpret_cast<char*>(&chunk[0]), 
          chunk.size()) || 
      dataFile.gcount()) 
    { 
     // append each chunk to our data store 
     bytes.insert(bytes.end(), 
        chunk.begin(), 
        chunk.begin() + dataFile.gcount()); 
    } 

    dataFile.close(); // close the file when we're done 
} 
else 
{ 
    std::cerr << "Failed to create file stream on ->" << fileName << "<-" << std::endl; 
}