Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi String mit gzip (ent)zippen (https://www.delphipraxis.net/89090-string-mit-gzip-ent-zippen.html)

MatthiasR 1. Apr 2009 14:59

Re: String mit gzip (ent)zippen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Danke für die Aufklärung! Auch wenn ich ehrlich gesagt nicht alles 100%ig verstanden habe, so sehe ich ein, dass das ganze sehr fehlerträchtig ist. Daher habe ich nun meine Anwendung auf Streams umgestellt und an sich funktioniert alles bestens, nur habe ich jetzt ein neues Problem (ich könnte echt druchdrehen!):

In einem weiteren gzip-komprimierten String-Container wurden zwei XML-Konstrukte unmittelbar hintereinander gehängt. Und zwar in dieser Art:
Zitat:

<?xml version="1.0" encoding="ISO-8859-15"?>
<Dokument1>
...
</Dokument1>
<?xml version="1.0" encoding="ISO-8859-15"?>
<Dokument2>
...
</Dokument2>
Dekomprimiere ich diese gzip-Datei mittels 7zip, so erhalte ich das doppelte XML-Konstrukt so wie erwartet. Lasse ich jedoch die Funktion "GZDecompressStream(InputStream, OutputStream)" darauf los, so erhalte ich als Ergebnis lediglich den ersten Teil. Alles ab dem zweiten XML-Header fehlt!

Woran liegt das denn nun schon wieder???

Probier es selbst mal aus, ich hab dir eine entsprechende Datei mal angehängt.

gammatester 1. Apr 2009 17:05

Re: String mit gzip (ent)zippen
 
Mit meinen gzio-Routinen funktioniert's. Vielleicht ein Bug in DelphiZLib.123?

Gruß Gammatester

MatthiasR 2. Apr 2009 07:27

Re: String mit gzip (ent)zippen
 
Da hast du recht, über deine gzio-Unit hat das ganze funktioniert. Da ich aber ungern über den Umweg einer Datei arbeiten will, würde ich gerne was anderes dafür verwenden. Deine gzdbuf werde ich nun auch nochmal testen, aber ich muss ehrlich sagen: das Handling der ZLibEx-Units fällt mir persönlich deutlich leichter, da die eben "Delphi-like" sind. Aber ist ja auch kein Wunder, deine Units sollen ja nur ein 1 zu 1 Port der C Routinen (mit gewissen Erweiterungen) sein, wenn ich das richtig verstanden hab.

MatthiasR 2. Apr 2009 08:29

Re: String mit gzip (ent)zippen
 
So, nun habe ich endlich herausgefunden, warum das mit deiner gzdbuf-Unit bisher nicht funktionierte. Ich habe der Funktion gzb_init als Buffer ein dynamisches Array übergeben, kein statissches wie in deinem Beispiel. Und dynamische Arrays beginnen ja mit dem Index 0 und nicht wie bei dir mit 1.

Was müsste ich ändern, damit das ganze auch mit dynamischen Arrays klappt? Auf jeden Fall bin ich nun wieder einen Schritt weiter.

gammatester 2. Apr 2009 08:58

Re: String mit gzip (ent)zippen
 
Zitat:

Zitat von Infect
So, nun habe ich endlich herausgefunden, warum das mit deiner gzdbuf-Unit bisher nicht funktionierte. Ich habe der Funktion gzb_init als Buffer ein dynamisches Array übergeben, kein statissches wie in deinem Beispiel. Und dynamische Arrays beginnen ja mit dem Index 0 und nicht wie bei dir mit 1.

Was müsste ich ändern, damit das ganze auch mit dynamischen Arrays klappt? Auf jeden Fall bin ich nun wieder einen Schritt weiter.

Hier das angepaßte Demoprogramm für vsd.gz, der interessante Teil sollte unabhängig von dynamisch/statissch sein, wenn Dein Puffer mit Index 0 beginnt.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  ibuf: array of byte;
  f: file;
  gz: gzbuf;
  i: integer;
  s: string;
begin
  assignfile(f,'vsd.gz');
  system.reset(f,1);
  setlength(ibuf,5000);
  blockread(f,ibuf[0],1242);
  gz := gzb_init(pBytef(@ibuf[0]),1242); // dies ist der interessante Teil
  s := '';
  while not gzb_eof(gz) do begin
    i := gzb_getc(gz);
    if i<0 then break;
    if (i>0) and (i<256) then s := s+char(i);
  end;
  richedit1.Text := s;
end;
Gruß Gammatester

MatthiasR 2. Apr 2009 09:22

Re: String mit gzip (ent)zippen
 
:dancer2: Juhu, so funktioniert das ganze! :dancer2:

In deinem Beispielprogramm von letzter Woche sah die Wertüberprüfung von i aber noch so aus:
Delphi-Quellcode:
if (i > 31) and (i < 256) then
Ich vermute mal, du wolltest damit nicht druckbare Steuerzeichen überspringen. Das ist in meinem Fall gewünscht und daher würde ich das so belassen.

Gut, dann hätten wirs ja. Thread darf als gelöst betrachtet werden. Und nochmals danke an alle Beteiligten! :cheers:


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

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