Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Decompress einer gz-Datei mit NULL-Zeichen (https://www.delphipraxis.net/201231-decompress-einer-gz-datei-mit-null-zeichen.html)

philipp.hofmann 3. Jul 2019 16:16

Decompress einer gz-Datei mit NULL-Zeichen
 
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

DieDolly 3. Jul 2019 16:27

AW: Decompress einer gz-Datei mit NULL-Zeichen
 
Guck dir mal
Delphi-Quellcode:
TStrings.LoadFromStream
an.

philipp.hofmann 3. Jul 2019 19:43

AW: Decompress einer gz-Datei mit NULL-Zeichen
 
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?

DieDolly 3. Jul 2019 22:05

AW: Decompress einer gz-Datei mit NULL-Zeichen
 
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?

philipp.hofmann 3. Jul 2019 22:35

AW: Decompress einer gz-Datei mit NULL-Zeichen
 
Liste der Anhänge anzeigen (Anzahl: 1)
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.

DieDolly 3. Jul 2019 22:59

AW: Decompress einer gz-Datei mit NULL-Zeichen
 
Schon TBytesStream statt TFileStream getestet?

peterbelow 4. Jul 2019 12:01

AW: Decompress einer gz-Datei mit NULL-Zeichen
 
Zitat:

Zitat von philipp.hofmann (Beitrag 1435919)
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?

Redeemer 4. Jul 2019 12:54

AW: Decompress einer gz-Datei mit NULL-Zeichen
 
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.

Jumpy 4. Jul 2019 15:40

AW: Decompress einer gz-Datei mit NULL-Zeichen
 
Vielleicht kann man in dem Stream LUnzip einfach die #0 ersetzen oder man guckt mal wieso TStringliast.LoadFromStream bei einer #0 abbricht.

dummzeuch 4. Jul 2019 15:48

AW: Decompress einer gz-Datei mit NULL-Zeichen
 
Zitat:

Zitat von philipp.hofmann (Beitrag 1435919)
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:50 Uhr.
Seite 1 von 2  1 2   

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