AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

String mit gzip (ent)zippen

Ein Thema von MatthiasR · begonnen am 26. Mär 2007 · letzter Beitrag vom 2. Apr 2009
Antwort Antwort
Seite 3 von 3     123
MatthiasR

Registriert seit: 21. Apr 2005
193 Beiträge
 
#21

Re: String mit gzip (ent)zippen

  Alt 1. Apr 2009, 14:59
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.
Angehängte Dateien
Dateityp: gz vsd_306.gz (1,2 KB, 18x aufgerufen)
  Mit Zitat antworten Zitat
gammatester

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

Re: String mit gzip (ent)zippen

  Alt 1. Apr 2009, 17:05
Mit meinen gzio-Routinen funktioniert's. Vielleicht ein Bug in DelphiZLib.123?

Gruß Gammatester
  Mit Zitat antworten Zitat
MatthiasR

Registriert seit: 21. Apr 2005
193 Beiträge
 
#23

Re: String mit gzip (ent)zippen

  Alt 2. Apr 2009, 07:27
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.
  Mit Zitat antworten Zitat
MatthiasR

Registriert seit: 21. Apr 2005
193 Beiträge
 
#24

Re: String mit gzip (ent)zippen

  Alt 2. Apr 2009, 08:29
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.
  Mit Zitat antworten Zitat
gammatester

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

Re: String mit gzip (ent)zippen

  Alt 2. Apr 2009, 08:58
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
  Mit Zitat antworten Zitat
MatthiasR

Registriert seit: 21. Apr 2005
193 Beiträge
 
#26

Re: String mit gzip (ent)zippen

  Alt 2. Apr 2009, 09:22
Juhu, so funktioniert das ganze!

In deinem Beispielprogramm von letzter Woche sah die Wertüberprüfung von i aber noch so aus:
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!
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 01:59 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