ZLib - "CompressBuf"

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

ZLib - "CompressBuf"

Beitrag von Aliobaba »

Hallo,

.... wahrscheinlich wieder 'mal nur ein banales Problem: Ich probiere gerade aus, einen String zu komprimieren, aber schon bei der Programm-Funktion erscheint folgende Fehlermeldung:

"Error: Identifier not found "CompressBuf"
- (selbiges bei "DecompressBuf")

obwohl "ZLib" bei "uses" eingebunden ist.

Warum findet Lazarus "CompressBuf" nicht?
Was muss ich noch einbinden?

Danke!
Aliobaba

Code: Alles auswählen

 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);
  finally
    if InpBuf <> nil then FreeMem(InpBuf);
    if OutBuf <> nil then FreeMem(OutBuf);
  end;
end;     

http://www.delphipraxis.net/18249-strin ... ieren.html
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: ZLib - "CompressBuf"

Beitrag von theo »

Glaskugel anwerf.....

Hmm, gibt es nicht. Gibt es auch bei Delphi nicht mehr. Sagt jedenfalls Tante Google, wenn man sie fragt.
http://embarcadero.newsgroups.archived. ... 52549.html

Probier mal was mit zstream oder so.

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: ZLib - "CompressBuf"

Beitrag von Aliobaba »

Danke Theo,

... dass man bei der Suche nach "Zippen", "String" , "kompromieren" , "Lazarus" , "Delphi" usw. auch auf "veraltete" und nicht mehr gültige Einträge trifft - damit habe ich nicht gerechnet. Gerechnet habe ich allerdings mit (für mich) komplizierten Stream-Konstrukten :?

Gibt es tatsächlich keine einfache(!) Möglichkeit für einen "Anfänger", ganz schlicht einen Text-String zu komprimieren?

Ich denke da an sowas:

Code: Alles auswählen

String_2 := Jetzt-komprimiere_ich_ganz_toll(String_1);
String_3 := Jetzt-dekomprimiere_ich_ganz_toll(String_2);
 
Procedure Jetzt-komprimiere_ich_ganz_toll(Komp_String : String);
begin
  ............
end;
 
Procedure Jetzt-dekomprimiere_ich_ganz_toll(De_Komp_String : String);
begin
  ............
end;


Aliobaba
(Obige Prozeduren natürlich besser als Funktionen)
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Achtzig
Beiträge: 90
Registriert: Mo 15. Okt 2007, 13:09
OS, Lazarus, FPC: Debian
CPU-Target: xxBit

Re: ZLib - "CompressBuf"

Beitrag von Achtzig »

Wenn ich es richtig sehe, bietet die Einheit paszlib die gewünschten Funktionen:

function compress(dest:Pchar;var destLen:cardinal; source : Pchar; sourceLen:cardinal):longint;
function uncompress(dest:Pchar;var destLen:cardinal; source : Pchar; sourceLen:cardinal):longint;

Ich habe die aber noch nicht ausprobiert.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: ZLib - "CompressBuf"

Beitrag von theo »

Aliobaba hat geschrieben:Gibt es tatsächlich keine einfache(!) Möglichkeit für einen "Anfänger", ganz schlicht einen Text-String zu komprimieren?


Naja, du vergisst vielleicht, dass das ein so komprimierter String eigentlich keiner mehr ist. Er besteht auch aus Bytewerten, die nicht in einen String gehören.

Wenn du es einfach haben willst, kannst du z.B. meinen guten alten MemoryDataPacker verwenden.

http://www.theo.ch/lazarus/uDataPacker.pas

Das geht dann z.B. so:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var DP:TMemoryDataPacker;
  AString:String;
begin
  DP:=TMemoryDataPacker.Create(0);
  AString:='Dies ist ein Test, Dies ist ein Test, Dies ist ein Test, Dies ist ein Test';
  DP.AddString(AString);
  DP.Compress;
  //Writeln(Length(AString),' ',DP.Stream.Size);
  DP.Stream.SaveToFile('test.strm');
  DP.free;
  //--------------------------------------------
  DP:=TMemoryDataPacker.Create(0);
  DP.Stream.LoadFromFile('test.strm');
  DP.DeCompress;
  ShowMessage(DP.GetString());
  DP.free;
end;

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: ZLib - "CompressBuf"

Beitrag von Aliobaba »

Hallo Theo,

Whow!!! Exakt genau das, was ich die ganze Zeit gesucht habe: Funktionierte auf Anhieb!!
Vielen, vielen Dank!!

Aliobaba

Eine Frage noch: kann ich den komprimierten Stream auch in einem "Memo" oder Textfile Speichern ohne es vorher in ein File auf die Festplatte schreiben zu müssen?
... nachträglich - nach dem Nachdenken :oops: editiert:
Sorry war wahrscheinlich eine dumme Frage: geht offenbar nicht. Du sagtest ja deutlich genug: "Naja, du vergisst vielleicht, dass das ein so komprimierter String eigentlich keiner mehr ist."
Zuletzt geändert von Aliobaba am Mo 4. Nov 2013, 11:52, insgesamt 1-mal geändert.
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: ZLib - "CompressBuf"

Beitrag von Aliobaba »

.... der Zweck meiner Anfrage:
In meinem Programm "MyMemoryDB" [ http://www.mymemorydb.n-bay.de/ ] würde ich gerne einzelne Memoinhalte "bei Bedarf" verschlüsseln können.
Dies ist weiter kein Problem; aber so richtig schön wäre dies halt, wenn man den Text vor dem Verschlüsseln auch noch komprimieren könnte.

Aliobaba
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: ZLib - "CompressBuf"

Beitrag von theo »

In DP.Stream ist ein normaler MemoryStream mit den Daten.
Auf den kannst du zugreifen wie du willst, zB. Byteweise auslesen

Code: Alles auswählen

DP.Stream.ReadBuffer(AByte,1);

Aber da ist natürlich nichts menschenlesbares drin.

Oder DP.Stream.Memory ist der Zeiger auf die Daten.

Aliobaba hat geschrieben:Dies ist weiter kein Problem; aber so richtig schön wäre dies halt, wenn man den Text vor dem Verschlüsseln auch noch komprimieren könnte.


Ich würde das evtl. in der umgekehrten Reihenfolge machen, aber was hält dich davon ab?

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: ZLib - "CompressBuf"

Beitrag von Aliobaba »

Hallo Theo,

jetzt klappt - Dank Deiner Hilfe - alles! :D
theo hat geschrieben:Ich würde das evtl. in der umgekehrten Reihenfolge machen, aber was hält dich davon ab?
Dazu noch eine kurze Anmerkung:
Bei verschlüsselten Texten ist eine Komprimierung nicht mehr möglich,
da "zuviel Durcheinander - keine "Regelmäßigkeiten".

Nochmals Danke!!

Aliobaba
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: ZLib - "CompressBuf"

Beitrag von carli »

Aliobaba hat geschrieben:Danke Theo,

... dass man bei der Suche nach "Zippen", "String" , "kompromieren" , "Lazarus" , "Delphi" usw. auch auf "veraltete" und nicht mehr gültige Einträge trifft - damit habe ich nicht gerechnet. Gerechnet habe ich allerdings mit (für mich) komplizierten Stream-Konstrukten :?

Gibt es tatsächlich keine einfache(!) Möglichkeit für einen "Anfänger", ganz schlicht einen Text-String zu komprimieren?

Ich denke da an sowas:

Code: Alles auswählen

String_2 := Jetzt-komprimiere_ich_ganz_toll(String_1);
String_3 := Jetzt-dekomprimiere_ich_ganz_toll(String_2);
 
Procedure Jetzt-komprimiere_ich_ganz_toll(Komp_String : String);
begin
  ............
end;
 
Procedure Jetzt-dekomprimiere_ich_ganz_toll(De_Komp_String : String);
begin
  ............
end;


Aliobaba
(Obige Prozeduren natürlich besser als Funktionen)


Bitteschön: https://bitbucket.org/carli/toastengine ... at=default

(Hinweis: meine Unit kodiert die Stringlänge noch in die Zip-Daten ein, damit weniger alloziiert werden muss)

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: ZLib - "CompressBuf"

Beitrag von Aliobaba »

Danke! ... aber der Zugang ist nur mit Passwort möglich :cry:
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: ZLib - "CompressBuf"

Beitrag von hubblec4 »

theo hat geschrieben:
Mo 4. Nov 2013, 10:45


Wenn du es einfach haben willst, kannst du z.B. meinen guten alten MemoryDataPacker verwenden.

http://www.theo.ch/lazarus/uDataPacker.pas
Ich brauchte auch so einen Pack-Mechanismus und habe deinen uDataPacker genutzt.
Es ging alles sofort wie gewünscht.

Danke für diese feine Unit.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: ZLib - "CompressBuf"

Beitrag von theo »

hubblec4 hat geschrieben:
Do 15. Okt 2020, 20:41
Ich brauchte auch so einen Pack-Mechanismus und habe deinen uDataPacker genutzt.
Es ging alles sofort wie gewünscht.

Danke für diese feine Unit.
Freut mich, wenn dieser Code noch nützlich ist.
Der stammt noch aus Kylix Zeiten. :D

Antworten