Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi String ressourcenschonend de/komprmieren (https://www.delphipraxis.net/46218-string-ressourcenschonend-de-komprmieren.html)

Zacherl 20. Mai 2005 17:05


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:
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;
Florian

Zacherl 22. Mai 2005 20:00

Re: String ressourcenschonend de/komprimieren
 
Kennt denn jemand 'ne nicht zu große Unit mit Kompressionsverfahren für strings?

Florian

marabu 22. Mai 2005 20:55

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:
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;
Grüße vom marabu

Zacherl 23. Mai 2005 16:57

Re: String ressourcenschonend de/komprmieren
 
Also bei mir funktioniert der Code nicht! Es kommt an der Oben angegebenen Stelle der Fehler. :cry:

Florian

marabu 23. Mai 2005 19:20

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 07:25 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