Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi zlib + stream komprimieren (https://www.delphipraxis.net/59658-zlib-stream-komprimieren.html)

the_seed 26. Dez 2005 18:31


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;

md_mse 26. Dez 2005 19:54

Re: zlib + stream komprimieren
 
In den TCompressionStream kannst du nur schreiben und nicht lesen!
Du versuchst mit
Delphi-Quellcode:
result.CopyFrom(xx, cs.Size);
cs.Size-Bytes vom TCompressionStream xx nach result zu kopieren...

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;

the_seed 26. Dez 2005 21:11

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;

the_seed 30. Dez 2005 14:51

Re: zlib + stream komprimieren
 
keiner nen tip?

md_mse 31. Dez 2005 00:26

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;

the_seed 31. Dez 2005 15:20

Re: zlib + stream komprimieren
 
das haut leider nicht hin :/ gibt nen fehler (Ungültige Stream Operation),
die position ist aber auf anfang gesetzt!

md_mse 31. Dez 2005 15:41

Re: zlib + stream komprimieren
 
Warscheinlich kann dir der TDecompresisonStream die Size nicht zurückgeben.
Delphi-Quellcode:
CopyFrom(xx, Orginalgröße);
Die Größe müsstest du dann anders rausbekommen

marabu 31. Dez 2005 17:13

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:
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;
Silvestergrüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz