AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein [Gelöst] mit (Delphi)-ZLib PKZIP/WindowsArchive entpacken
Thema durchsuchen
Ansicht
Themen-Optionen

[Gelöst] mit (Delphi)-ZLib PKZIP/WindowsArchive entpacken

Ein Thema von Satty67 · begonnen am 24. Aug 2010 · letzter Beitrag vom 24. Aug 2010
Antwort Antwort
Satty67

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

[Gelöst] mit (Delphi)-ZLib PKZIP/WindowsArchive entpacken

  Alt 24. Aug 2010, 07:41
Hallo,

ein paar wichtige Dateien und Ordner habe ich bisher per Batch täglich in einem PKZIP-Archiv gesichert. PKZIP ist ja im Prinzip das gleiche Format, wie Windows komprimierte Ordner und lassen sich ab XP direkt ohne weitere Hilfsmittel öffnen. Zum erstellen der Batch hatte ich ein kleines Programm (das sammelt nur die Dateien und generiert die Strings für die Kommandozeile).

Jetzt wollte ich einfach selber die PKZIP-Archive erstellen, wozu ich einfach die Unit ZLib verwende. Abrevia und Co. können das natürlich auch, aber das wäre ja langweilig

Zum Problem:

ZLib setzt den komprimierten Daten ein 16bit Prüfwert voran, was beim Schreiben des PKZIP-Archiv einfach weggeschnitten wird. Die Archive können problemlos von Windows oder Archiv-Programmen gelesen und entpackt werde. Nur kann ich nicht mit ZLib entpacken, da mir der 16bit Prüfwert fehlt.

Wäre er am Ende, würde ich ihn selber generieren und an den Stream anhängen. Hat jemand eine Idee, wie ich mit ZLib dekomprimieren kann, ohne den 16bit Prüfwert? In der ZLib Unit konnte ich keinen Weg finden, das zu Umgehen. Der relevante Code liegt wohl in den OBJ-Dateien.

Zum spielen ein kleines Testprogramm in der Anlage
Angehängte Dateien
Dateityp: zip ZLib_Experimente_20100824.zip (11,8 KB, 41x aufgerufen)

Geändert von Satty67 (24. Aug 2010 um 21:43 Uhr)
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#2

AW: Problem: mit ZLib PKZIP/WindowsArchive entpacken

  Alt 24. Aug 2010, 08:39
Wenn Du von zlib redest, meinst Du die Unit zlib, die von Borland oder wem auch immer als Unit für die zlib-Bibliothek angepriesen wird?

Die richtige zlib-Bibliothek verwendet nämlich keinen 16-Bit-Prüfprefix sondern eine 32-Bit-Adler-Checksumme am Ende. Wenn Du in die richtigen zlib-Routine einen zlib-Stream (wie in Punkt 2.2 derzlib-Spezifikation beschrieben) reinfütterst, solltest Du damit keine Probleme mehr haben.

Wenn Du diesen Weg gehen willst, sollte ein Suche einige Delphi-Units finden.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.116 Beiträge
 
Delphi 12 Athens
 
#3

AW: Problem: mit ZLib PKZIP/WindowsArchive entpacken

  Alt 24. Aug 2010, 08:52
Du kannst den Prüfwert doch immernoch selber generieren, am Anfang einfügen und dann entpacken.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Satty67

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

AW: Problem: mit ZLib PKZIP/WindowsArchive entpacken

  Alt 24. Aug 2010, 09:00
Ja, hatte oben ja angedeutet, dass mir die fertigen Units/Komponenten/Dlls bekannt sind. Es ist auch kein Problem für mich, mit entsprechenden "fremden" Hilfsmitteln PKZIP-Archive zu entpacken.

Nur suche ich im Moment eine Lösung für Delphis-ZLib Unit. Ich bräuchte quasi eine Lösung mit möglichst wenig Fremdcode für ein anderes Projekt (das oben erwähnte Mini-Backup Programm ist dabei quasi nur Test-Platform).

@himitsu: Also es ist scheinbar eine Prüfsumme für die entpackten Daten. Die kann ich nicht im Vorfeld mit den gepackten Daten erstellen.

Geändert von Satty67 (24. Aug 2010 um 09:03 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.116 Beiträge
 
Delphi 12 Athens
 
#5

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

  Alt 24. Aug 2010, 09:41
Hmmmmmm, du könntest in den Zipdateikommentaren oder in einer Extradatei in der ZIP diese Prüfzumen ablegen.

Ich weiß auch nicht, ob man sich von der ZLib etwas entpackenlassen und dabei die Prüfsume ignorieren kann.
Eventuell einfach irgendeine Dummyprüfsume einfügen, entpacken und die Fehlermeldung ignorieren.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (24. Aug 2010 um 09:45 Uhr)
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#6

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

  Alt 24. Aug 2010, 09:59
Nebenbei bemerkt:
Hat ein ZIP-File nicht eine maximale Größe von 2 GB?
Welches Fileformat wäre besser? 7zip?
  Mit Zitat antworten Zitat
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, 10: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 11:42 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:02 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