Einzelnen Beitrag anzeigen

Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#7

AW: Problem: mit (Delphi)-ZLib PKZIP/WindowsArchive entpacken

  Alt 24. Aug 2010, 11:55
Jain, der PKZIP-Header kommt mit 4 GByte klar, aber das reicht auch.

Bin der Sache näher gekomen, die vorangestellten Bytes scheinen doch reproduzierbar. Hatte vorher immer mit der gleichen Quelle gestestet, weshalb mir nicht aufgefallen ist, was mit der neuen Testumgebung auffällt:

Mini-Testumgebung (3x Memo, 2x Button, 1x Label, ZipDataStream als Form-Member)
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  ZipDataStream := TMemoryStream.Create();
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  ZipDataStream.Free;
end;

procedure TForm1.ButtonCompressClick(Sender: TObject);
var
  CompStream : ZLib.TCompressionStream;
  SourceStream : TStringStream;
  SourceSize : Integer;
  b : Byte;
begin
  ZipDataStream.Size := 0;
  SourceStream := TStringStream.Create(Memo1.Text);
  SourceSize := SourceStream.Size;

  CompStream := ZLib.TCompressionStream.Create(clDefault, ZipDataStream);
  try
    CompStream.CopyFrom(SourceStream, 0);
  finally
    CompStream.Free;
    SourceStream.Free;
  end;

  Label1.Caption := Format('%d Bytes komprimiert zu %d Bytes.',
                                  [SourceSize, ZipDataStream.Size]);

  ZipDataStream.Position := 0;
  memo2.clear;
  while ZipDataStream.Read(b, 1) = 1 do
    memo2.Text := memo2.Text + IntToHex(b,2) +' ';
end;

procedure TForm1.ButtonDecompressClick(Sender: TObject);
var
  DeCompStream : ZLib.TDeCompressionStream;
  TargetStream : TStringStream;
  s : String;
  c : AnsiChar;
begin
  ZipDataStream.Position := 0;
  TargetStream := TStringStream.Create('');
  DeCompStream := ZLib.TDeCompressionStream.Create(ZipDataStream);

  try
    s := '';
    while DeCompStream.Read(c, SizeOf(c)) = SizeOf(c) do
      s := s + c;
    Memo3.Text := s;
  finally
    DeCompStream.Free;
    TargetStream.Free;
  end;
end;
Sowohl bei Delphi 5 als auch bei Delphi 2007 haben die beiden Bytes den Hex-Wert 78 9C. Sorry, dass mir das vorher nicht aufgefallen ist.... damit sollte sich das Problem lösen lassen.

@himitsu

Deine erste Lösung war schon die richtige, hatte die nur verworfen, weil ich annahm es ist eine Prüfsumme. Ist aber wohl nur ein magic-Header.

Geändert von Satty67 (24. Aug 2010 um 12:42 Uhr)
  Mit Zitat antworten Zitat