Problem mit TCompressionStream



  • Hallo,

    Ich möchte Daten de/kompremieren udn nutze dazu ZLib. Dde Dekompression funktioniert wunderbar doch nun brauch ich auch Kompression und da liegt mein Problem:

    void ZIPCompress(TStream *In,TStream *Out)
    {
    	Byte Buf[16384];
    	try
    	{
    		TCompressionStream* C = new TCompressionStream(clMax,In);
    		try
    		{
    			for(int Count = 1;Count>0;)
    			{
    				Count = C->Read(Buf, sizeof(Buf));
    				Out->Write(Buf,Count);
    			}
    		}
    		__finally
    		{
    		delete C;
    		}
    	}
    	catch ( ... )
    	{
    	throw Exception("Error while Compressing!");
    	}
    }
    

    Ich bekomme bei diesem Code immer nur Fehler wie:

    Invaild Stream operation
    Stream write error
    usw..

    Wo liegt der Fehler?

    MfG Tetsu



  • In welcher Zeile treten die Fehler auf?
    Hast du für Out Speicher reserviert?
    Wie gross ist sizeof(Buf) tatsächlich?
    Setz vor dem Lesen mal C->Position auf 0.



  • void ZIPDecompress(TStream *In,TStream *Out)
    {
    Byte Buf[16384];
    try
    {
    	TDecompressionStream* D = new TDecompressionStream(In);
    	try
    	{
    		for(int Count = 1;Count>0;)
    		{
    			Count = D->Read(Buf, sizeof(Buf));
    			Out->Write(Buf,Count);
    		}
    	}
    	__finally
    	{
    	delete D;
    	}
    }
    catch ( ... )
    {
    throw Exception("Error while decompressing!");
    }
    }
    

    Das ist die Kompressionsroutine, sprich das genaue Gegenteil von der Dekompressionsroutine. Speicher resavieren für out brauch ich doch garnicht oder? Es ist ein MemoryStream und Write() resaviert das bei allen anderen Methoden wie ich dies verwende automatisch.

    Aber der Fehler scheint nach Out->Write() zu liegen denn wenn ich danach einen Befehl einfüg wird dieser nichtmehr ausgeführt.



  • Du mußt natürlich Speicher für Out reservieren. Dies könnte ja auch außerhalb von ZIPDecompress geschehen aber eine gültige Instanz ist schon notwendig. Das machst du doch bei D auch.
    Wozu übergibst du da eigentlich In?



  • In ist der Stream mit der Quelle der Daten die Kompremiert werden sollen und in Out ausgegeben sollen werden.
    Ich habe Compress wie Decompress geleich (wie ihr ja seht) Jedoch funktioniert nur Compress nicht.



  • Geh doch einfach mal mit dem debugger durch und schau dir den Inhalt der Variablen an. Das sollte erstmal helfen.
    Du schreibst gerade, dass Compress nicht geht, zeigst uns aber den Quellcode von Decompress. was denn nun?



  • Entschuldigung wenn ich für Verwirrung sorge.

    Also ich habe nocheinmal herumprobiert und den Fehler gefunden, Ich musste bei new TCompressionStream(clMax,In); statt IN, OUT schreiben da ansonsten versucht wird IN in IN zu schreiben

    Trodzdem danke für die Hilfe

    Tetsu


Anmelden zum Antworten