Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Stream komprimieren / dekomprimieren (https://www.delphipraxis.net/173481-stream-komprimieren-dekomprimieren.html)

ToZie 27. Feb 2013 10:15

Delphi-Version: 5

Stream komprimieren / dekomprimieren
 
Hallo,

irgendwie hab ich ein Problem mit dem Verständnis der Funktion von TCompressionStream / TDecompressionStream der zlib. Ich versuche folgendes:

Code:
function compressStream(smIn, smOut: TStream; level: TCompressionLevel = clDefault): int64;
var
  smCmp: TCompressionStream;
begin
  try
    smCmp:=TCompressionStream.Create(level, smOut);
    result:=smCmp.CopyFrom(smIn, 0);
  finally
    smCmp.Free;
  end;
end;

function decompressStream(smIn, smOut: TStream): int64;
var
  smDec: TDeCompressionStream;
begin
  try
    smIn.Position:=0;
    smDec:=TDeCompressionStream.Create(smIn);
    result:=smOut.CopyFrom(smDec, 0);
  finally
    smDec.Free;
  end;
end;

procedure Test;
var
  smIn, smOut, smDec: TMemoryStream;
begin
  try
    smIn:=TMemoryStream.Create;
    smOut:=TMemoryStream.Create;
    smDec:=TMemoryStream.Create;

    smIn.ReadFromFile('irgendwas.txt');
    compressStream(smIn, smOut);
    decompressStream(smOut, smDec);
  finally
    smIm.Free;
    smOut.Free;
    smDec.Free;
  end;
end;
Beim dekomprimieren tritt bei smOut.CopyFrom(smDec, 0) eine 'Ungültige Stream Operation' auf, weiss jemand warum?


Vielen Dank

Torsten

CCRDude 27. Feb 2013 10:55

AW: Stream komprimieren / dekomprimieren
 
Wenn ich mich recht erinnere, braucht TDecompressionStream die Größe des entpackten Streams. Solltest Du also z.B. vorab unkomprimiert speichern und auslesen.

stahli 27. Feb 2013 11:21

AW: Stream komprimieren / dekomprimieren
 
vielleicht hilft Dir das weiter: http://www.delphipraxis.net/152827-z...ompressed.html

ToZie 27. Feb 2013 13:18

AW: Stream komprimieren / dekomprimieren
 
Zitat:

Zitat von CCRDude (Beitrag 1205259)
Wenn ich mich recht erinnere, braucht TDecompressionStream die Größe des entpackten Streams. Solltest Du also z.B. vorab unkomprimiert speichern und auslesen.

Tatsache, mit Angabe der ungepackten Größe funktioniert das. Da ich den gepackten Stream per socket übers Netzwerk versende muss ich diese wohl irgendwie mit transportieren - oder..

Zitat:

Zitat von stahli (Beitrag 1205261)

diese tolle Lösung verwenden

Vielen Dank Euch beiden :)

Torsten


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:09 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