AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

GZip-Stringinhalt extrahieren

Ein Thema von rdeutsch · begonnen am 30. Okt 2024 · letzter Beitrag vom 31. Okt 2024
Antwort Antwort
rdeutsch

Registriert seit: 24. Mär 2006
77 Beiträge
 
Delphi 12 Athens
 
#1

GZip-Stringinhalt extrahieren

  Alt 30. Okt 2024, 16:38
Hallo

Ich haben einen String mit einem gzip-komprimierten Inhalt. Dieser Stringinhalt soll nun als "lesbaren" String extrahiert werden.

Beispiel:
Inhalt gzip-String : H4sIAAAAAAAAA/NIzMnJVwhJrSgBAM5sM2wKAAAA
Extrahierter String: Hallo Text

Leider sind alle meine bisherigen Versuche kläglich gescheitert.

z.B. myDecompressedString := zlib.ZDecompressStr(BytesOf('H4sIAAAAAAAAA/NIzMnJVwhJrSgBAM5sM2wKAAAA')) resultiert in einer Fehlermeldung "... Exception der Klasse EZDecompressionError mit der Meldung 'data error' aufgetreten."

Kann mir hier jemand weiterhelfen bzw. was mache ich falsch?

Danke im Voraus und Grüsse,
Robert
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: GZip-Stringinhalt extrahieren

  Alt 30. Okt 2024, 16:47
Diese Delphi-Funktionen sind "andersrum".

Delphi-Referenz durchsuchenZCompressStr = einen "String" komprimieren und binär (TBytes) rausgeben
Delphi-Referenz durchsuchenZDecompressStr = dieses Binäre wieder in einen "String" dekomprimieren

Du hast hier aber Base64-kodierte Daten, mit irgendeinem Payload davor.

Fazit:
* erst dieses Base64 in ein TBytes konvertieren
* welches du anschließend dekomrimieren kannst
$2B or not $2B

Geändert von himitsu (30. Okt 2024 um 16:52 Uhr)
  Mit Zitat antworten Zitat
rdeutsch

Registriert seit: 24. Mär 2006
77 Beiträge
 
Delphi 12 Athens
 
#3

AW: GZip-Stringinhalt extrahieren

  Alt 31. Okt 2024, 09:56
Danke dir, aber leider erhalte ich immer noch den "data error"-Fehlermeldung beim Aufruf von ZDecompressStr(myBytes).

Code:
myDecompressedString := DecompressBase64GZipString('H4sIAAAAAAAAA/NIzMnJVwhJrSgBAM5sM2wKAAAA');

function DecompressBase64GZipString(Value: String): String;
var myBytes: TBytes;
begin
  myBytes := System.NetEncoding.TNetEncoding.Base64.DecodeStringToBytes(Value);
  result := zLib.ZDecompressStr(myBytes);
end;
Wenn ich den Stringinhalt 'H4sIAAAAAAAAA/NIzMnJVwhJrSgBAM5sM2wKAAAA' z.B. auf https://codebeautify.org/gzip-decompress-online eingebe, klappt problemlos.

Was mache ich da falsch?
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
650 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: GZip-Stringinhalt extrahieren

  Alt 31. Okt 2024, 14:04
Ich vermute da wird versucht mit deflate zu dekomprimieren.

Schau dir mal die System.ZLib.TZDecompressionStream.Create Funktion an. Da gibt es einen Parameter WindowsBits, der steuert, dass man gzip benötigt. Siehe auch die Hilfe dazu unter: https://docwiki.embarcadero.com/Libr...nStream.Create

Hier ist noch ein Blog zu diesem Thema: https://blog.dummzeuch.de/2023/07/27...ion-in-delphi/
  Mit Zitat antworten Zitat
rdeutsch

Registriert seit: 24. Mär 2006
77 Beiträge
 
Delphi 12 Athens
 
#5

AW: GZip-Stringinhalt extrahieren

  Alt 31. Okt 2024, 15:46
Yes, deine Vermutung war richtig. WindowsBits und der Blog von dummzeuch hat mir auf die Sprünge geholfen.

Mit untenstehendem Code klappt die Umwandlung von 'H4sIAAAAAAAAA/NIzMnJVwhJrSgBAM5sM2wKAAAA' nach 'Hallo Text' wunderbar.

Vielen Dank für eure Hilfe.

Code:
function DecompressGzipBase64(Value: string; parUseGZip: boolean): string;
var WindowBits: Integer;
    Bytes: TBytes;
    BytesStream: TBytesStream;
    DecompressionStream: TZDecompressionStream;
    OutStream: TMemoryStream;
    resText : AnsiString;
begin
  result := '';
  WindowBits := 15;
  if parUseGZip then WindowBits := WindowBits + 16;

  // base64-String decodieren und in Bytearray ablegen
  Bytes := TNetEncoding.Base64.DecodeStringToBytes(Value);

  // Inhalt des Bytearrays extrahieren
  DecompressionStream := nil;
  BytesStream := TBytesStream.Create(Bytes);
  try
    OutStream := TMemoryStream.Create();
    DecompressionStream := TZDecompressionStream.Create(BytesStream, WindowBits);
    DecompressionStream.Position := 0;
    OutStream.CopyFrom(DecompressionStream, 0);
    OutStream.Position := 0;
    SetLength(resText, OutStream.Size);
    OutStream.Read(resText[1], OutStream.Size);
  finally
    BytesStream.Free;
    DecompressionStream.Free;
    OutStream.Free;
  end;
  result := resText;
end;

Geändert von rdeutsch (31. Okt 2024 um 16:10 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

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

AW: GZip-Stringinhalt extrahieren

  Alt 31. Okt 2024, 18:53
Es freut mich zu hören, dass mein Blog-Post auch anderen hilft. Ich bin immer unsicher, ob es sinnvoll ist, solche Sachen zu posten.

Hauptsächlich mache ich das wirklich, damit ich es später per Google finde, falls ich dasselbe Problem irgendwann nochmal habe und dann den Post schon längst vergessen habe. Das ist schon mehrfach passiert. Vielleicht werde ich alt, oder ich mache einfach zu viele unterschiedliche Sachen (gerade mal wieder Perl Programmierung. Das ist sowas von primitiv, wenn man Delphi gewohnt ist.)
Thomas Mueller
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

AW: GZip-Stringinhalt extrahieren

  Alt 31. Okt 2024, 20:26
Aber warum kommt da ein Datenfehler?

Delphi-Quellcode:
uses System.NetEncoding, System.ZLib;

procedure TForm2.FormCreate(Sender: TObject);
var
  myBytes, myText: TBytes;
begin
  const Value = 'H4sIAAAAAAAAA/NIzMnJVwhJrSgBAM5sM2wKAAAA';
  myBytes := TNetEncoding.Base64.DecodeStringToBytes(Value);
  ZDecompress(myBytes, myText); // <<<<<<<<
  //...
end;
Ob als Stream oder Bytes, sollte doch keinen Unterschied machen.


[add] Ahhh, die Bits.

Zitat:
WindowBits + 16
Wenn das Bits sind, müsste es dann nicht OR anstatt + sein?
(auch wenn es HIER zufällig passt)


OK, steht in der Hilfe ... 8 bis 15
und z.B. "add 16" für spezielles GZip-Zeugs.

Anzahl der Bits ... nicht selbst eine BitMaske.

Delphi-Quellcode:
WindowBits := $0F;
if parUseGZip then WindowBits := $1F;
//if parUseGZip then WindowBits := WindowBits or $10;

WindowBits := %0000_1111;
if parUseGZip then WindowBits := %0001_1111;
//if parUseGZip then WindowBits := WindowBits or %0001_0000;
$2B or not $2B

Geändert von himitsu (31. Okt 2024 um 20:38 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 04:27 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