AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen Delphi ZLib - String komprimieren dekomprimieren
Thema durchsuchen
Ansicht
Themen-Optionen

ZLib - String komprimieren dekomprimieren

Ein Thema von himitsu · begonnen am 9. Mär 2012
Antwort Antwort
Benutzerbild von himitsu
himitsu

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

ZLib - String komprimieren dekomprimieren

  Alt 9. Mär 2012, 23:20
Zitat von roboter202:
Hallo,

ich hab grad deinen Thread über ZLib und das komprimieren von Strings gelesen => hier.

Leider hat es bei mir nicht auf anhieb geklappt. Kann es sein das es statt CompressBuf(Input[1],[...] ,
CompressBuf(@Input[1],[...] heißen muss, denn es wird ja ein Pointer kein Char erwartet?

Naja ich wollte das nur anmerken nicht das noch einer dran verzweifelt
Kann ja mal passieren.
Ich möchte diesbezüglich noch etwas zum Eintrag hinzufügen:

Es wurde die/eine CompressBuf-Funktion verwendet, welche untypisierte Var- und Const-Parameter verwedete.
Ist nur ein CompressBuf mit Pointern vorhanden, dann fehlen dort natürlich noch die @.

Außerdem ist diese Funktion ist nur auf den AnsiString zugeschnitten, also nur bis Delphi 2006 / Turbo Delphi ordentlich funktionsfähig.

Delphi-Quellcode:
Uses ZLib;

Function CompressAnsiString(const Input: AnsiString): RawByteString;
  Var Buffer: Pointer;
    BufSize: Integer;

  Begin
    Buffer := nil;
    Try
      CompressBuf(Input[1], Length(Input), Buffer, BufSize);
      SetLength(Result, BufSize);
      Move(Buffer^, Result[1], BufSize);
    Finally
      If Buffer <> nil Then FreeMem(Buffer);
    End;
  End;

Function DeCompressAnsiString(const Input: RawByteString): AnsiString;
  Var Buffer: Pointer;
    BufSize: Integer;

  Begin
    Buffer := nil;
    Try
      DeCompressBuf(Input[1], Length(Input), 0, Buffer, BufSize);
      SetLength(Result, BufSize);
      Move(Buffer^, Result[1], BufSize);
    Finally
      If Buffer <> nil Then FreeMem(Buffer);
    End;
  End;

Function CompressWideString(const Input: UnicodeString): RawByteString; overload;
  Var Buffer: Pointer;
    BufSize: Integer;

  Begin
    Buffer := nil;
    Try
      CompressBuf(Input[1], Length(Input) * 2, Buffer, BufSize);
      SetLength(Result, BufSize);
      Move(Buffer^, Result[1], BufSize);
    Finally
      If Buffer <> nil Then FreeMem(Buffer);
    End;
  End;

Function DeCompressWideString(const Input: RawByteString): UnicodeString;
  Var Buffer: Pointer;
    BufSize: Integer;

  Begin
    Buffer := nil;
    Try
      DeCompressBuf(Input[1], Length(Input), 0, Buffer, BufSize);
      SetLength(Result, BufSize div 2);
      Move(Buffer^, Result[1], BufSize div 2);
    Finally
      If Buffer <> nil Then FreeMem(Buffer);
    End;
  End;

Function CompressString(const Input: String): RawByteString;
  Var Buffer: Pointer;
    BufSize: Integer;

  Begin
    Buffer := nil;
    Try
      CompressBuf(Input[1], Length(Input) * SizeOf(Char), Buffer, BufSize);
      SetLength(Result, BufSize);
      Move(Buffer^, Result[1], BufSize);
    Finally
      If Buffer <> nil Then FreeMem(Buffer);
    End;
  End;

Function DeCompressString(const Input: RawByteString): String;
  Var Buffer: Pointer;
    BufSize: Integer;

  Begin
    Buffer := nil;
    Try
      DeCompressBuf(Input[1], Length(Input), 0, Buffer, BufSize);
      SetLength(Result, BufSize div SizeOf(Char));
      Move(Buffer^, Result[1], BufSize div SizeOf(Char));
    Finally
      If Buffer <> nil Then FreeMem(Buffer);
    End;
  End;
Statt dem RawByteString könnte man auch einen AnsiString oder TBytes (Array of Byte) verwenden.
(beim Array nicht vergessen, daß dort der Startindex [0] und nicht [1] ist)


Und bei aktuelleren den ZLib-Versionen kann man nun auch direkt auf vorhandene Funktionen zurückgreifen.
Delphi-Quellcode:
function ZCompressStr(const s: string; level: TZCompressionLevel = zcDefault): TBytes;
function ZCompressStr(const s: string; level: TCompressionLevel): TBytes; // CG: Add overload to take old enum type
function ZDecompressStr(const s: TBytes): string;
[edit]
Ich merk grade was ... die von SubData erwähnte Version ... Ich denke mal, daß ist die selbe, welche nun im Delphi direkt verbaut ist. (seit mindestend Delphi 2010)
Wem dort nun die Version für UTF8String oder AnsiString fehlt, der nehme einfach
Delphi-Quellcode:
function ZCompressStr(const s: RawByteString; level: TZCompressionLevel): TBytes;
var
  buffer: Pointer;
  size: Integer;
begin
  ZCompress(PAnsiChar(s), Length(s), buffer, size, level);
  try
    SetLength(Result, size);
    Move(buffer^, pointer(result)^, size);
  finally
    FreeMem(buffer);
  end;
end;
(nur etwas unschön, daß dort immernoch die Resourcenschutzblöcke vergessen wurden )
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (10. Mär 2012 um 00:10 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 18:37 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