AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Decompress einer gz-Datei mit NULL-Zeichen
Thema durchsuchen
Ansicht
Themen-Optionen

Decompress einer gz-Datei mit NULL-Zeichen

Ein Thema von philipp.hofmann · begonnen am 3. Jul 2019 · letzter Beitrag vom 5. Jul 2019
Antwort Antwort
Seite 1 von 2  1 2      
philipp.hofmann

Registriert seit: 21. Mär 2012
Ort: Hannover
891 Beiträge
 
Delphi 10.4 Sydney
 
#1

Decompress einer gz-Datei mit NULL-Zeichen

  Alt 3. Jul 2019, 16:16
Hi,

bisher decompresse ich gz-Dateien mit folgendem Code:

Delphi-Quellcode:
uses System.Zlib;

class function TStringUtils.gzUnzip(filename:String):TStringList;
var
   LInput:TFileStream;
   LUnZip:TZDecompressionStream;
begin
   Result:=TStringList.Create(true);
   LInput:=TFileStream.Create(filename,fmOpenRead + fmShareDenyNone);
   LUnZip:=TZDecompressionStream.Create(LInput,15+32);
   Result.LoadFromStream(LUnzip);
   LUnZip.Free;
   LInput.Free;
end;
Jetzt funktioniert dies leider nicht mit gz-Dateien, wo ein NULL-Zeichen enthalten ist. Dort enthält das Result dann nur den File-Inhalt bis zum NULL-Zeichen.
Wenn ich den Umweg über eine Datei gehe, welche ich dann in einem zweiten Schritt einlese, geht es zwar, ist aber inperformant, das mache ich eigentlich nur das riesen gz-Files:
Delphi-Quellcode:
class procedure TStringUtils.gzUnzipToFile(readFile,writeFile:String);
var
   LInput,LOutput:TFileStream;
   LUnZip:TZDecompressionStream;
begin
   LOutput:=TFileStream.Create(writeFile,fmCreate);
   LInput:=TFileStream.Create(readFile,fmOpenRead+fmShareDenyNone);
   LUnZip:=TZDecompressionStream.Create(LInput,15+32);
   LOutput.CopyFrom(LUnZip,0);
   LUnZip.Free;
   LInput.Free;
   LOutput.Free();
end;
Wie bekomme ich es hin, dass ich ohne den Umweg über eine Datei das gz-File komplett in meine TStringList bekomme?


Grüße, Philipp
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#2

AW: Decompress einer gz-Datei mit NULL-Zeichen

  Alt 3. Jul 2019, 16:27
Guck dir mal TStrings.LoadFromStream an.
  Mit Zitat antworten Zitat
philipp.hofmann

Registriert seit: 21. Mär 2012
Ort: Hannover
891 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Decompress einer gz-Datei mit NULL-Zeichen

  Alt 3. Jul 2019, 19:43
Ich verstehe die Aussage nicht so ganz: Soll ich mir TStrings.LoadFromStream anschauen, weil es eine Alternative ist (dann kann ich dies sein lassen, weil TStringList ist die Implementierung von TStrings) oder weil ich mir anschauen soll, was in dieser Implementierung schief läuft?
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#4

AW: Decompress einer gz-Datei mit NULL-Zeichen

  Alt 3. Jul 2019, 22:05
Ich habs jetzt nicht getestet aber mit DeineStringList.LoadFromStream() kannst du deinen Stream in deine StringList laden.
Zitat:
Wie bekomme ich es hin, dass ich ohne den Umweg über eine Datei das gz-File komplett in meine TStringList bekomme?
  Mit Zitat antworten Zitat
philipp.hofmann

Registriert seit: 21. Mär 2012
Ort: Hannover
891 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Decompress einer gz-Datei mit NULL-Zeichen

  Alt 3. Jul 2019, 22:35
Ja, das Problem ist ja, wenn in dem gz-File (Beispiel im ZIP-Anhang) ein NUL-Zeichen enthalten ist, dann liest er nur bis zu NUL und nicht weiter.
Ich habe ein kleines Demoprojekt mit Beispiel gz-Datei hochgeladen, was das Problem verdeutlicht.
Die obere TMemo wird aus einer TStringList befüllt und dort steht nur der Header meiner gz-Datei.
Aber die untere TMemo wird direkt befüllt und dort steht alles, d.h. hier habe ich schon einen Hinweis auf eine Lösung, weil es in TMemo.Lines funktioniert, warum auch immer, ist aber schrecklich langsam bei großen Dateien. Aber da habe ich schon mal einen Ansatzpunkt, da TMemo.Lines eigentlich auch wieder TStrings ist.
Angehängte Dateien
Dateityp: zip UnzipTest.zip (63,9 KB, 6x aufgerufen)

Geändert von philipp.hofmann ( 3. Jul 2019 um 22:46 Uhr)
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#6

AW: Decompress einer gz-Datei mit NULL-Zeichen

  Alt 3. Jul 2019, 22:59
Schon TBytesStream statt TFileStream getestet?
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
702 Beiträge
 
Delphi 12 Athens
 
#7

AW: Decompress einer gz-Datei mit NULL-Zeichen

  Alt 4. Jul 2019, 12:01
Hi,

bisher decompresse ich gz-Dateien mit folgendem Code:

Delphi-Quellcode:
uses System.Zlib;

class function TStringUtils.gzUnzip(filename:String):TStringList;
var
   LInput:TFileStream;
   LUnZip:TZDecompressionStream;
begin
   Result:=TStringList.Create(true);
   LInput:=TFileStream.Create(filename,fmOpenRead + fmShareDenyNone);
   LUnZip:=TZDecompressionStream.Create(LInput,15+32);
   Result.LoadFromStream(LUnzip);
   LUnZip.Free;
   LInput.Free;
end;
Jetzt funktioniert dies leider nicht mit gz-Dateien, wo ein NULL-Zeichen enthalten ist. Dort enthält das Result dann nur den File-Inhalt bis zum NULL-Zeichen.
Wenn ich den Umweg über eine Datei gehe, welche ich dann in einem zweiten Schritt einlese, geht es zwar, ist aber inperformant, das mache ich eigentlich nur das riesen gz-Files:
Delphi-Quellcode:
class procedure TStringUtils.gzUnzipToFile(readFile,writeFile:String);
var
   LInput,LOutput:TFileStream;
   LUnZip:TZDecompressionStream;
begin
   LOutput:=TFileStream.Create(writeFile,fmCreate);
   LInput:=TFileStream.Create(readFile,fmOpenRead+fmShareDenyNone);
   LUnZip:=TZDecompressionStream.Create(LInput,15+32);
   LOutput.CopyFrom(LUnZip,0);
   LUnZip.Free;
   LInput.Free;
   LOutput.Free();
end;
Wie bekomme ich es hin, dass ich ohne den Umweg über eine Datei das gz-File komplett in meine TStringList bekomme?


Grüße, Philipp
Garnicht, macht auch keinerlei Sinn, da #0 innerhalb eines Strings eigentlich kein erlaubtes Zeichen ist. Mißbrauchst Du da einen String um binäre Daten zu speichern?

Außerdem: trau der Anzeige des stringlist-Inhalts im Debugger (oder in einem Control) nicht! #0 ist ein string-Terminator für Windows, selbst wenn die stringist deine #0s übernommen hat wird der Text nur bis zum ersten #0 angezeigt.

Außerdem: Welches Text-Encoding verwendete die gZippte Datei?
Peter Below
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.053 Beiträge
 
Delphi 2009 Professional
 
#8

AW: Decompress einer gz-Datei mit NULL-Zeichen

  Alt 4. Jul 2019, 12:54
Ich hab mal vor einiger Zeit eine Unit für Gzip gemäß RFC 1952 erstellt, kannst du ja mal probieren:
http://yat.qa/DEV/src/RedeemerGzip.pas
Das Feld Zlib ist dann ein Zlib-kompatibler Stream, den sollte man mit dem DecompressionStream lesen können.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.736 Beiträge
 
Delphi 6 Enterprise
 
#9

AW: Decompress einer gz-Datei mit NULL-Zeichen

  Alt 4. Jul 2019, 15:40
Vielleicht kann man in dem Stream LUnzip einfach die #0 ersetzen oder man guckt mal wieso TStringliast.LoadFromStream bei einer #0 abbricht.
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.605 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

AW: Decompress einer gz-Datei mit NULL-Zeichen

  Alt 4. Jul 2019, 15:48
Hi,

bisher decompresse ich gz-Dateien mit folgendem Code:

Jetzt funktioniert dies leider nicht mit gz-Dateien, wo ein NULL-Zeichen enthalten ist. Dort enthält das Result dann nur den File-Inhalt bis zum NULL-Zeichen.
Wo genau gibt es das NULL-Zeichen? In der gz-Datei oder in der unkomprimierten Datei?

Falls in der gz-Datei, sollte das eigentlich kein Problem darstellen, da dann durch das un-gzip daraus wieder eine Datei ohne NULL-Zeichen enstehen sollte.

Falls in der unkomprimierten Datei, wundert es mich, dass der Umweg -> als Datei dekomprimieren -> diese Datei in Stringlist laden funktioniert.
Thomas Mueller
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 06:54 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