Seite 1 von 1

QHttp, gzip, zlib

Verfasst: 11. Januar 2008 15:30
von RD1978
Hallo, ich brauch mal eure Hilfe.

Über ein QHttp Objekt hole ich Daten gzip-komprimiert vom Webserver ab, was soweit auch funktioniert. Nun speicher ich die komprimierten Daten in einem QTemporaryFile zwischen und öffen/lese ich die Datei dann mit der zlib. Die unkomprimierten Daten speicher ich dann in einem QByteArray um mir mit QRegExp die Daten rauszuholen die ich brauch.

Das Problem ist nun, das die unkomprimierten Daten im QByteArray an verschiedenen Stellen jedesmal Fehlerhaft sind, was dann natürlich hin und wieder Salat gibt.

Code: Alles auswählen

header.setValue( "Accept-Encoding", "gzip;q=0.9" );

Code: Alles auswählen

QByteArray MyClass::uncompressData( bool &ok )
{
	ok = true;
	QByteArray uncompressedData;
	QTemporaryFile tmp_file( "user" );
	
	if( !tmp_file.open() )
	{
		qDebug() << "tmp_file not open...";
		ok = false;
	}
	
	if( ok )
	{
		tmp_file.write( m_pHttp->readAll() );
		
		if( !tmp_file.flush() )
		{
			qDebug() << "tmp_file flush error...";
			ok = false;
		}
		
		if( ok )
		{
			gzFile gz_file;
			gz_file = gzopen( tmp_file.fileName().toLocal8Bit().constData(), "rb9" );
			
			if( !gz_file )
			{
				qDebug() << "gz_file not open...";
				ok = false;
			}
			
			if( ok )
			{
				char buffer[1024 * 4];
				while( gzread( gz_file, buffer, 1024 * 4 ) )
				{
					uncompressedData.append( buffer );
				}
				
				if( gzclose( gz_file ) != Z_OK )
				{
					qDebug() << "gz_file not closed...";
					ok = false;
				}
				
				tmp_file.close();
			}
		}
	}
	
	return uncompressedData;
}
Hat jemand eine Idee was ich falsch mache?

---------
Qt 4.3.2
g++ 3.4.5
Windows XP
AMD64 X2

Verfasst: 11. Januar 2008 16:28
von Christian81
Erstmal würde ich schauen ob ich die Daten z.B. per 7-zip oder WinZip ohne Fehler öffnen kann.
Dann evtl. qUnCompress() benutzen.

Verfasst: 11. Januar 2008 16:44
von RD1978
Danke für Deine Antwort,

qUncompress() hatte ich zu erst probiert, hat nicht funktioniert.

Hab das Programm jetzt mal unter Gentoo Linux x86_64 compiliert und getestet, ist aber ganau das selbe Problem.

Werd dann mal versuchen die Datei mit einem Zipper zu öffnen...

Verfasst: 11. Januar 2008 16:50
von Christian81
qUnCompress:
Note: If you want to use this function to uncompress external data compressed using zlib, you first need to prepend four bytes to the byte array that contain the expected length of the uncompressed data encoded in big-endian order (most significant byte first).

Verfasst: 11. Januar 2008 17:05
von RD1978
Versteh ich das richtig, daß die ersten 4 Byte in dem QByteArray die zu erwartende Größe für die unkompriemierten Daten enthalten müssen?

Wenn ja, woher weiß ich denn wie groß die Daten sind?

Verfasst: 11. Januar 2008 17:23
von RD1978
Hab die Tempdatei jetzt mal mit WinRar geöffnet. Da liegt ein Ordner drin und in dem Ordner eine Datei. Hab die Datei dann mal ausgepackt, die scheint Fehlerfrei zu sein... hab jedenfals keine gefunden.

Verfasst: 11. Januar 2008 17:28
von Christian81
Dann kann ich nur noch auf http://sourceforge.net/projects/quazip verweisen - das funktioniert auf alle Fälle (und man braucht kein QTemporaryFile)

Verfasst: 11. Januar 2008 17:31
von RD1978
Ok danke,

werd das mal versuchen.

Verfasst: 12. Januar 2008 16:24
von patrik08
Christian81 hat geschrieben:Dann kann ich nur noch auf http://sourceforge.net/projects/quazip verweisen - das funktioniert auf alle Fälle (und man braucht kein QTemporaryFile)

Wie geht es denn ohne file?

gzopen hat ein file was ist das gegen stuck um im buffer zu dekomprimieren?

Code: Alles auswählen


/* ist teil von :

http://fop-miniscribus.googlecode.com/svn/trunk/fop_miniscribus.1.0.0/fop_lib/network_get.h

und geht gut um bilder zu holen aus dem netz...

*/

void  LoadPage::DecompressStream()
{
    /*  QByteArray byteArray;   incomming data */
    
    QChar letter('A' + (qrand() % 26));
    /* must not go on file solution gunzip buffer ? */
    const QString tmpfiler = QString("%1/http_%2.gz").arg( QDir::homePath ()).arg(letter);
    
    /*
     QBuffer qtbuffer;
     qtbuffer.open(QBuffer::ReadWrite);
     qtbuffer.write(byteArray);
     qtbuffer.seek(0);
    */
    
    
    
    QFile f( tmpfiler );
      if ( f.open( QIODevice::WriteOnly ) ) {
        f.write(byteArray);
        f.close();
      } else {
      std::cout << "### Unable to work on cache dir!. "  << std::endl;
      return;
      }
      
     gzFile file;
      file = gzopen (tmpfiler.toUtf8().data(),"rb");
      if(!file) {
        std::cout << "### Unable to work on cache dir!. "  << std::endl;
        return;
      }
      QByteArray input;
      char buffer[1024];
      QByteArray inputData;
      while(int readBytes =  gzread (file, buffer, 1024))
       {
        input.append(QByteArray(buffer, readBytes));
      }
      gzclose(file);
      f.remove();
      
      byteArray.clear();
      byteArray.append(input);
}