![]() |
String ressourcenschonend de/komprmieren
Hallo,
wie kann ich einen String de/komprmieren? Ich habe schon das hier gefunden, was aber beim dekomprimieren: "Ungültige Zeigeroperation" ausgibt.
Delphi-Quellcode:
Florian
uses
ZLib; function CompressString(input:string):string; var InpBuf, OutBuf: Pointer; OutBytes: Integer; begin InpBuf := nil; OutBuf := nil; try GetMem(InpBuf, Length(input)); Move(input[1], InpBuf^, Length(input)); CompressBuf(InpBuf, Length(input), OutBuf, OutBytes); SetLength(result,OutBytes); Move(OutBuf^, result[1], OutBytes); finally if InpBuf <> nil then FreeMem(InpBuf); if OutBuf <> nil then FreeMem(OutBuf); end; end; function DeCompressString(input:string):string; var InpBuf, OutBuf: Pointer; OutBytes: Integer; begin InpBuf := nil; OutBuf := nil; try GetMem(InpBuf, Length(input)); Move(input[1], InpBuf^, Length(input)); DeCompressBuf(InpBuf, Length(input),0,OutBuf, OutBytes); SetLength(result,OutBytes); Move(OutBuf^, result[1], OutBytes); //[edit]: hier kommt der Fehler finally if InpBuf <> nil then FreeMem(InpBuf); if OutBuf <> nil then FreeMem(OutBuf); end; end; |
Re: String ressourcenschonend de/komprimieren
Kennt denn jemand 'ne nicht zu große Unit mit Kompressionsverfahren für strings?
Florian |
Re: String ressourcenschonend de/komprmieren
Abgesehen von ein paar überflüssigen Statements funktioniert der Code, aber statistische Komprimierung verkehrt sich bei zu kleinen Datenmengen leicht ins Gegenteil. Ich nehme an, dass du keine konkrete Anwendung im Sinn hast und mehr die Funktionalität der Library ausloten willst.
Delphi-Quellcode:
Grüße vom marabu
function CompressString(input: string): string;
var OutBuf: Pointer; OutBytes: Integer; begin try CompressBuf(@Input[1], Length(input), OutBuf, OutBytes); SetLength(result, OutBytes); Move(OutBuf^, result[1], OutBytes); finally if OutBuf <> nil then FreeMem(OutBuf); end; end; function DeCompressString(input: string): string; var OutBuf: Pointer; OutBytes: Integer; begin try DeCompressBuf(@Input[1], Length(input), 0, OutBuf, OutBytes); SetLength(result, OutBytes); Move(OutBuf^, result[1], OutBytes); finally if OutBuf <> nil then FreeMem(OutBuf); end; end; |
Re: String ressourcenschonend de/komprmieren
Also bei mir funktioniert der Code nicht! Es kommt an der Oben angegebenen Stelle der Fehler. :cry:
Florian |
Re: String ressourcenschonend de/komprmieren
Hallo Florian,
tatsächlich hat dein Code bei mir mit 'the quick brown fox jumps over the lazy dog' funktioniert, aber das war reiner Zufall. Dein Problem ist, dass du natürlich nur solche Strings komprimieren darfst, die im resultierenden Byte-Strom keinen low value (#0) aufweisen. Oder du musst mit short strings arbeiten, da diese #0 nicht zur Terminierung benötigen. Macht auch nicht so richtig froh. Am besten du vergisst das mit den Strings und machst es wie andere Leute auch - mit array of char. Grüße vom marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:47 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