![]() |
gzip entpacken
Hi
Ich bekomme nach eine /Get Befehl mit Gzip gepackte Daten zurück. Meine Frage wie bekomme ich die in einen String? Und noch eine Frage Kann man tstream variablen in strings umwandeln?? MFG |
Re: gzip entpacken
GZip-Dateien werden mit der ZLib verarbeitet (eine nicht unbedingt gute / schnelle Implementation ist bei Delphi dabei). TStreams stellen eine Datei o. ä. dar, um einen String zu erhalten, einfach aus dem Stream lesen(Read).
|
Re: gzip entpacken
Könntest du mir das vielleicht an einem Beispiel zeigen(gzip entpacken)??
Bin nicht so bewandert bei Delphi. |
Re: gzip entpacken
Wenn du die komprimeirten Daten in einem Stream hast:
Delphi-Quellcode:
Is' aber untested.
uses ..., ZLib;
{...} function GZipStreamToString(const input: TStream): string; var str: TDecompressionStream; buffer: array[0..2000] of char; count: Longint; begin str:= TDecompressionStream.Create(input); repeat count:= str.Read(buffer, 2000); result:= result + buffer; until count < 2000; str.Free end; /edit: Code in eine Funktion gepackt |
Re: gzip entpacken
Danke, werds mal testen.
|
Re: gzip entpacken
Zitat:
![]() |
Re: gzip entpacken
Was hat denn das in der Internetsparte verloren? Verschoben.
|
Re: gzip entpacken
Also, ich hab das jetzt zum laufen gebracht aber es gibt mir immer nue sowas zurück:
wۑf MFG |
Re: gzip entpacken
Sicher das du 'ne HTML- oder Textdatei zurückkriegst? Bei Bildern sollte man nicht über einen String gehen, sondern einen TMemorystream + LoadFormStream nehmen.
|
Re: gzip entpacken
Ich bekomme auf jeden Fall eine HTML Datei zurück!!!
So schaut das im Moment bei mir aus:
Delphi-Quellcode:
Vielleicht findet ja jemand nen Fehler. Hab die Heise Seite einfach mal als beispiel genommen.
procedure TForm1.Button1Click(Sender: TObject);
var responseStream:Tfilestream; begin idhttp1.request.AcceptEncoding:='gzip'; responseStream := TFileStream.Create(edit1.text, fmCreate); idhttp1.get('http://www.heise.de/newsticker/meldung/64197',responseStream); edit2.text:=GZipStreamToString(responseStream); end; function tform1.GZipStreamToString(const input: TStream): string; var str: TDecompressionStream; buffer: array[0..2000] of char; count: Longint; begin str:= TDecompressionStream.Create(input); repeat count:= str.Read(buffer, 2000); result:= result + buffer; until count < 2000; str.Free end; |
Re: gzip entpacken
Zwei Fragen:
Erstens, muss die Seite auf der Festplatte zwischengespeichert werden? Ansonsten würde sich ein TMemorystream anbieten. Zweitens (hab grade kein Delphi, um nachzugucken), ist der Stream nach Get noch geöffnet? Meine Funktion kann das (noch) nicht überprüfen. /edit: Evtl. ist es auch ein input.Seek(0, soFromBeginning), was vor dem TDecompressionStream.Create fehlt. :gruebel: |
Re: gzip entpacken
Der Stream muss nicht auf der Festplatte zwischengespeichert werden
und ich denke mal, dass der Stream nach dem get noch offen ist, wird doch direkt der Funktion übergeben!? Edit: Mit dem input.Seek(0, soFromBeginning) bekomme ich einen ECompressionError |
Re: gzip entpacken
Mir ist gerade aufgefallen, dass die Indys auch eine ZLib-Implementation haben... :oops: Wieso ist mir das nicht aufgefallen?Mit dem neuen Wissen ausgerüstet:
Delphi-Quellcode:
Ist wieder untested.
uses ..., IdZlibEx;
{...} function GZipStreamToString(const input: TStream): string; var temp: TMemorystream; begin input.Seek(0, soFromBeginning); temp:= TMemorystream.Create; ZDecompressStream(input, temp); SetLength(result, temp.Size); temp.Read(@result[1], temp.Size); end; |
Re: gzip entpacken
Werds gleich testen, muss erst arbeiten,
editiere das dann rein, wenns geht. THX Edit: Also, damit der code läuft musste ich hier:
Delphi-Quellcode:
das @ weglassen.
temp.Read(@result[1], temp.Size);
Und wenn ich das dann durchlaufen lasse, kommt folgender Fehler: EZDecompressionError with Message 'data error'. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz