Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Dekomprimierung eines Streams (https://www.delphipraxis.net/139097-dekomprimierung-eines-streams.html)

GreenHorn3600 23. Aug 2009 15:59


Dekomprimierung eines Streams
 
Hallo Wissende,

ich bin mal wieder am verzweifeln. Weshalb lässt sich der Stream nicht dekomprimieren?

Delphi-Quellcode:
{Dekompremiert den Stream}
procedure DecrompressStream(aStream: TStream);
var
  zc: TDecompressionStream;
  ms: TMemoryStream;
begin
  ms := TMemoryStream.Create;
  try
   zc := TDecompressionStream.Create(aStream);
   try
      ms.CopyFrom(zc, 0);
    finally
      zc.Free;
    end;
    aStream.Size := 0;
    aStream.copyFrom(ms, 0); //<< Hier kommt der Fehler
  finally
    ms.Free;
  end;
end;
Er bringt mir immer den Fehlercode 5 (System Error, Zugriff verweigert). Nur warum und was kann man gegen tun?

Edit: Es handelt sich mal wieder um die ZLib, Fehlerstelle gekennzeichnet

Grüße
Greeny

himitsu 23. Aug 2009 16:12

Re: Dekomprimierung eines Streams
 
sicher, daß .CopyFrom(..., 0) korrekt so ist?

GreenHorn3600 23. Aug 2009 16:25

Re: Dekomprimierung eines Streams
 
Sicher? Zwischenzeitlich nicht mehr...

aber der Fehler kommt hier:

Delphi-Quellcode:
aStream.Size := 0;
scheint also nicht wirklich damit zusammenzuhängen :|

himitsu 23. Aug 2009 16:48

Re: Dekomprimierung eines Streams
 
was ist denn in aStream für ein Stream drinnen?
nicht jeder StreamTyp unterstützt alle Befehle

[add]
und wegen der 0 in CopyFrom ... da gibt man Count an, also die Anzahl der zu kopierenden Bytes ... bei dir also NICHTS

GreenHorn3600 23. Aug 2009 16:50

Re: Dekomprimierung eines Streams
 
Hallo,

dies ist ein TFileStream, welcher einen zuvor Komprimierten Stream enthält. Dieser soll wieder DeKomprimiert und verarbeitet werden. Daher auch die ganze hin- und herkompiererei.

Igendwo, scheint der Wurm drin zu sein.

GreenHorn3600 23. Aug 2009 16:51

Re: Dekomprimierung eines Streams
 
Zitat:

Zitat von himitsu
[add]
und wegen der 0 in CopyFrom ... da gibt man Count an, also die Anzahl der zu kopierenden Bytes ... bei dir also NICHTS

stimmt nicht ganz, wenn hier bei .copyFrom(..., 0) angegeben ist, so wird intern die Position und die Größe gesetzt. Ist eine Erleichterung.

Ups, Fehlerstelle falsch markiert: hier kommt er aStream.Size := 0; also eine Zeile früher. Das kommt davon, wenn man ständig am kämpfen ist

himitsu 23. Aug 2009 16:58

Re: Dekomprimierung eines Streams
 
ok, dann arbeite ich wohl zu selten mit Stream :oops: (dachte das war bei -1)

ja, wie gesagt, was für einen Stream übergibst du denn nun der Prozedur?

GreenHorn3600 23. Aug 2009 17:01

Re: Dekomprimierung eines Streams
 
Zitat:

Zitat von GreenHorn3600
Hallo,

dies ist ein TFileStream, welcher einen zuvor Komprimierten Stream enthält. Dieser soll wieder DeKomprimiert und verarbeitet werden. Daher auch die ganze hin- und herkompiererei.

Igendwo, scheint der Wurm drin zu sein.


Was soll ich da erst sagen, Streams brauchte ich bisher noch nie, nur dieses mal, komme ich irgendwie nicht dran vorbei :|

turboPASCAL 23. Aug 2009 17:14

Re: Dekomprimierung eines Streams
 
Hilft das? http://www.delphipraxis.net/internal...=480137#480137

himitsu 23. Aug 2009 17:21

Re: Dekomprimierung eines Streams
 
gibt TDecompressionStream den aStream vielleicht frei?
:gruebel:

ich hab es jetzt mal so versucht unb scheitere schon beim 1. CopyFrom, also beim Komprimieren

Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils, Classes, ZLib;

{Dekompremiert den Stream}
procedure DecompressStream(aStream: TStream);
var
  zc: TDecompressionStream;
  ms: TMemoryStream;
begin
  ms := TMemoryStream.Create;
  try
   zc := TDecompressionStream.Create(aStream);
   try
      ms.CopyFrom(zc, 0);
    finally
      zc.Free;
    end;
    aStream.Size := 0;
    aStream.CopyFrom(ms, 0);
  finally
    ms.Free;
  end;
end;

{Kompremiert den Stream}
procedure CompressStream(aStream: TStream);
var
  zc: TCompressionStream;
  ms: TMemoryStream;
begin
  ms := TMemoryStream.Create;
  try
    zc := TCompressionStream.Create(clDefault, ms);
    try
      zc.CopyFrom(aStream, 0);
    finally
      zc.Free;
    end;
    aStream.Size := 0;
    aStream.CopyFrom(ms, 0);
  finally
    ms.Free;
  end;
end;

Var
  M: TMemoryStream;

begin
  M := TMemoryStream.Create;
  M.Write(M, 4); // irgendwas einlesen, damit was drin ist
  CompressStream(M);
  DecompressStream(M);
end.
[edit] Fehler im CompressStream behoben (Source und Dest sozusagen vertauscht) geht aber dennoch nicht
[edit2] OK, komprimieren geht nun :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:29 Uhr.
Seite 1 von 3  1 23      

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