Entwickler-Ecke

Sonstiges (Delphi) - ZLibEx - es funktioniert einfach nicht


sahib - Sa 23.04.05 02:17
Titel: ZLibEx - es funktioniert einfach nicht
Moin.

Vor einiger Zeit habe ich mir diese Komponente heruntergeladen (http://www.dellapasqua.com/delphizlib/). Damit können Dateien im ZIP-Format gepackt und entpackt werden. Wenn die URL aufgerufen wird, steht unten ein Beispiel. Da ich nur entpacken möchte, verwendete ich nur den unteren Teil.

Aber leider bekomme ich immer den 'data'-Fehler. Eine Suche im Internet hat einige wenige Treffer ergeben, aber das hat auch alles nicht geholfen. Daher habe ich die Hoffnung, dass sich hier jemand findet, der das Problem gelöst hat oder vielleicht die Fehlerquelle kennt. Unter Umständen gibt es auch eine andere, freie Komponente? Die ZLibEx hat den Vorteil, dass sie klein und schnell ist sowie keine DLL braucht.


Danke und viele Grüße,
Christian


Delete - Sa 23.04.05 03:05

Wie wäre es mit etwas Beispielcode deiner seits?


sahib - Sa 23.04.05 06:51

Moin Lucky.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
(* Mein Code *)
var
  InFileName, 
  OutFileName: String;
  InStream,
  OutStream: TMemoryStream;
  ZStream  : TZDecompressionStream;
  [...]

begin
  [...]
  // Zip-Datei laden, maximal 4MB
  InStream.LoadFromFile(InFileName);
  
  ZStream := TZDecompressionStream.Create(InStream);

  // *) Ab hier kommen die Fehler
  OutStream.CopyFrom(ZStream, 0);  // oder auch andere Werte
  OutStream.SaveToFile(OutFileName)
end;

initialization
  InStream  := TMemoryStream.Create;
  OutStream := TMemoryStream.Create;

finalization
  FreeAndNil(InStream)
  FreeAndNil(OutStream)



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
(* Original Code *)
  [...]
  InputFileName := 'c:\image.png.bzip';
  OutputFilename := 'c:\image2.png'//rename to original into final code
  InputStream := TFileStream.Create(InputFileName, fmOpenRead);
  OutputStream := TFileStream.Create(OutputFileName, fmCreate);
  DecompressionStream := TZDecompressionStream.Create(InputStream);
  OutputStream.CopyFrom(DecompressionStream, 0);
  DecompressionStream.Free;
  OutputStream.Free;
  InputStream.Free;
 [..]


Beiden Sources ist gemein, dass nach der Initialisierung des Dekomprimierungsstrems (ZStream bzw. DecompressionStream) keine Zugriffe auf denselben möglich sind. Es kommt zu einer Exception. Angeblich haben einige Leute es geschafft, mit folgender Version zu arbeiten - das läuft bei mir aber auch nicht. Sie liest die Datei eh nur portionsweise ein.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure ExpandStream(inStream, outStream :TStream);
const
 BufferSize = 4096;
var
 Count: Integer;
 ZStream: TZDecompressionStream;
 Buffer: array[0..BufferSize-1of Byte;
begin
 ZStream := TZDecompressionStream.Create(InStream);
 try
   while True do
     begin
       Count := ZStream.Read(Buffer, BufferSize);
       if Count <> 0 then OutStream.WriteBuffer(Buffer, Count) else Break;
     end;
 finally
   ZStream.Free;
 end;
end;


Ich hoffe, weitergeholfen zu haben und etwas Hilfe zu bekommen.

Einen schönen Tagesanfang noch, wünscht
Christian


oOXTCOo - So 12.12.10 23:27

ich habe genau das selbe problem: DATA ERROR!

hat hier jemand vieleicht einen funktionierenden demo source?

ich habe schon sämtliche (gibt ja scheinbar nicht viele) Zlib und ZlibEx sources durch, mit allen genau das selbe problem.

ich möchte einfach eine einzige datei komprimieren und dekomprimieren.
eventuell mit passwort (ist aber nicht unbedingt nötig, wäre nur schön).

ich habe gestern die ganze nacht damit verbracht sämtliche beispiele durchzugehen, auch das hier in diesem tread beschriebene, aber wie auch erwähnt bekomme ich damit auch eine "data error" fehlermeldung.

wäre super wenn mir hier jemand mit einem beispiel weiterhelfen könnte.

noch zu erwähnen wäre... ich versuche einfache textfiles zu komprimieren und zu dekomprimieren, später wenn es funktioniert möchte ich aber bin files verwenden die eine grösse zwischen 4-8 mb haben können.[quote]



@sahib hast du es geschafft?


Gammatester - Mo 13.12.10 00:29

Mit normalen Zlib-Funktionen können keine Ziparchive bearbeitet werden, jedenfalls nicht ohne den Zip-Format-Overhead selbst zu programmiern. Es gibt allerdings in der Zlib-Distribution die Minizip-Anwendung, die einfache Zip-Operationen implementiert. (Für zlib 1.1.4 auch als Pascal/Delphi-Code via http://home.netsurf.de/wolfgang.ehrhardt/misc_de.html#zlib) Die in dritten Beitrag angeführte bzip-Datei kann mit Sicherheit nicht mit zlib entpackt werden, da bzip einen ganz anderen Algorithmus (Burrows-Wheeler) verwendet als zlib (inflate/deflate).


oOXTCOo - Mo 13.12.10 00:55

also meine datei muss nicht zip kompatibel sein... das ist mir völlig egal.
ich möchte meine datein sowieso nur mit meinem eigenem programm kompatibel machen, sie sollen also nicht mit anderen tools entpackbar sein.

um es genau zu sagen, es sollen firmware update files gepackt werden die auch nur mit meinem programm selbst funktionieren sollen.
um download traffic zu sparen und dazu die datei noch inkompatibel zu anderen tools zu machen, möchte ich diese zuerst verschlüsseln und dann packen.

ich habe mir das so vorgestellt das ich die datei zuerst verschlüssle und dann packe, nach dem packen soll noch ein header angehangen werden indem die infos für mein programm stehen...

also welches file es ist, was genau es kann, zu welchen geräten es kompatibel ist und noch weitere wichtige infos die dann mein programm beim laden des files anzeigt.


platzwart - Mo 13.12.10 01:15

Aber das ganze wirst du dann ja auf dem Zielrechner wieder entpacken müssen. Also wird dort ein Programm von dir dort vorhanden sein, das man ganz einfach desassemblieren kann und schwups, hat man die Verschlüsselung.


oOXTCOo - Mo 13.12.10 01:22

ja, aber zumindest kann man die ganzen firmwares nicht einfach runterladen und für ein anderes tool verwenden.
man hat dann schon einiges an arbeit.

da ichs ja sowieso packen will um platz zu sparen, ist eine einfache verschlüsselung auch kein grosser aufwand.
es sind doch einige files die von 4mb pro file nur noch 1mb ergeben, das mal diverse downloads bringt schon eine grosse download traffic ersparnis mitsich.



NACHTRAG:
es scheint nun doch zu funktionieren, mit der modefizierten komponente für delphi 7 von hier: http://www.torry.net/pages.php?s=99

zumindest das packen habe ich gerade getestet, funktionierte ohne fehler...


NACHTRAG2:
alles klar, beide funktionen funktionieren so wie ichs brauche...


kurt59 - Mo 13.12.10 12:28

Und nicht vergessen - erst komprimieren und dann verschlüsseln.
Gut verschlüsselte Daten können nicht mehr komprimiert werden.


oOXTCOo - Fr 17.12.10 01:30

das geht für meine zwecke sehr schlecht.

ich muss zuerst verschlüsseln und dann komprimieren denn ich mache das:

beim entschlüsseln eines bereits komprimierten files
1.) file laden
2.) header lesen und infos zum file anzeigen - dannach gleich header löschen
3.) dekompriemieren
4.) jetzt habe ich das file noch immer verschlüsselt in einer tmp datei.
5.) die datei wird nun in 2048 byte grossen blöcken gelesen "on the fly" entschlüsselt und direkt in das ziel gerät geschrieben.
das läuft so lange durch bis das file zu ende ist.

so habe ich zu keiner zeit das file im entschlüsselten zustand auf der platte, serwohl aber im speicher stückchenweise.
aber wenn man die daten einfach wieder aus dem gerät auslesen würde oder sich die daten aus dem ram holt, kommt man tortzdem noch drann ohne auch nur einmal an die verschlüsselung denken zu müssen, aber es würde zumindest arbeit machen jedes file so wieder herzustellen.