![]() |
zlib + stream komprimieren
hallo habe probleme mit der komprimierung eines streams, programm spukt nach ausführung einen fehler von wegen ungültige stream operation!? was mache ich falsch?
Code:
function komprimiere(input:TStream):tmemorystream;
var xx: TCompressionStream; begin result:=tmemorystream.create; xx := TCompressionStream.Create(clmax, input); result.CopyFrom(xx, xx.Size); result.position:=0; end; |
Re: zlib + stream komprimieren
In den TCompressionStream kannst du nur schreiben und nicht lesen!
Du versuchst mit
Delphi-Quellcode:
cs.Size-Bytes vom TCompressionStream xx nach result zu kopieren...
result.CopyFrom(xx, cs.Size);
Richtig währe da:
Delphi-Quellcode:
function komprimiere(input:TStream):tmemorystream;
var xx: TCompressionStream; begin result := tmemorystream.create; xx := TCompressionStream.Create(clmax, result); xx.CopyFrom(input, input.Size); xx.Free; // !! NIcht vergessen, da der interne Buffer des TCompr.Streams sonst nicht geflusht wird result.position:=0; end; |
Re: zlib + stream komprimieren
funktioniert prima, danke dir!
hmm habe jetzt probleme mit dem entpacken :/ ist doch die gleiche routine wie beim packen oder?
Code:
function dekomprimiere(input:TStream):tmemorystream;
var xx: TdeCompressionStream; begin result := tmemorystream.create; xx := TdeCompressionStream.Create(result); xx.CopyFrom(input, input.Size); xx.Free; // !! NIcht vergessen, da der interne Buffer des TCompr.Streams sonst nicht geflusht wird result.position:=0; |
Re: zlib + stream komprimieren
keiner nen tip?
|
Re: zlib + stream komprimieren
Nein, diesmal musst du aus "xx" Lesen, und nicht da reinschreiben... :)
Delphi-Quellcode:
result := tmemorystream.create;
xx := TdeCompressionStream.Create(>>>input<<<); >>>result<<<.CopyFrom(xx, xx.Size); xx.Free; // !! NIcht vergessen, da der interne Buffer des TCompr.Streams sonst nicht geflusht wird result.position:=0; |
Re: zlib + stream komprimieren
das haut leider nicht hin :/ gibt nen fehler (Ungültige Stream Operation),
die position ist aber auf anfang gesetzt! |
Re: zlib + stream komprimieren
Warscheinlich kann dir der TDecompresisonStream die Size nicht zurückgeben.
Delphi-Quellcode:
Die Größe müsstest du dann anders rausbekommen
CopyFrom(xx, Orginalgröße);
|
Re: zlib + stream komprimieren
Hallo ihr Beiden,
leider ist der Einsatz der Methode CopyFrom() beim Dekomprimieren nicht möglich, da diese generische Methode die Zugriffsbedingungen des TDecompressionStream verletzt.
Delphi-Quellcode:
Silvestergrüße vom marabu
uses
ZLib; const BUFSIZE = 1024 * 16; procedure CompressStream(inStream, outStream: TStream); var cs: TCompressionStream; begin inStream.Position := 0; outStream.Size := 0; cs := TCompressionStream.Create(clDefault, outStream); cs.CopyFrom(inStream, 0); // copy all cs.Free; end; procedure DecompressStream(inStream, outStream: TStream); var ds: TDecompressionStream; bytes: Int64; buf: string; begin inStream.Position := 0; outStream.Size := 0; ds := TDecompressionStream.Create(inStream); repeat SetLength(buf, BUFSIZE); SetLength(buf, ds.Read(buf[1], BUFSIZE)); outStream.Write(buf[1], Length(buf)); until buf = ''; ds.Free; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz