AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi String ressourcenschonend de/komprmieren
Thema durchsuchen
Ansicht
Themen-Optionen

String ressourcenschonend de/komprmieren

Ein Thema von Zacherl · begonnen am 20. Mai 2005 · letzter Beitrag vom 23. Mai 2005
Antwort Antwort
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

String ressourcenschonend de/komprmieren

  Alt 20. Mai 2005, 17:05
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
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

Re: String ressourcenschonend de/komprimieren

  Alt 22. Mai 2005, 20:00
Kennt denn jemand 'ne nicht zu große Unit mit Kompressionsverfahren für strings?

Florian
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: String ressourcenschonend de/komprmieren

  Alt 22. Mai 2005, 20:55
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
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

Re: String ressourcenschonend de/komprmieren

  Alt 23. Mai 2005, 16:57
Also bei mir funktioniert der Code nicht! Es kommt an der Oben angegebenen Stelle der Fehler.

Florian
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: String ressourcenschonend de/komprmieren

  Alt 23. Mai 2005, 19:20
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
  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 01:08 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