Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi LZMA SDK - String in Stream packen (https://www.delphipraxis.net/125579-lzma-sdk-string-stream-packen.html)

smallsmoker 8. Dez 2008 20:17


LZMA SDK - String in Stream packen
 
hi leute,
ich habe mich heute durch den pascal port der lzma sdk durchgewurschtelt und es hinbekommen mir 2 dienste zu basteln die einen Stream komprimieren.
Das habe ich dann erfolgreich für dateikomprimierung benutzt jetzt wollte ich aber einen string komprimieren:

die datei komprimierung sieht in etwa so aus:

Delphi-Quellcode:

procedure TLZMAAlone.CompressStream(var InStream: TStream; var OutStream: TStream);
[..]

procedure TLZMAAlone.DecompressStream(var InStream: TStream; var OutStream: TStream);
[..]

procedure TLZMAAlone.CompressFile(FilepathIn, FilepathOut: String);
var
  inStream: TStream;
  outStream: TStream;
begin
  inStream:=TBufferedFS.Create(FilepathIn,fmOpenRead or fmsharedenynone);
  outStream:=TBufferedFS.Create(FilepathOut,fmcreate);
  try
    CompressStream( inStream, outStream);
  finally
    outStream.Free;
    inStream.Free;
  end;
end;

procedure TLZMAAlone.DecompressFile(FilepathIn, FilepathOut: String);
var
  inStream:TStream;
  outStream:TStream;
begin
  inStream:=TBufferedFS.Create(FilepathIn,fmOpenRead or fmsharedenynone);
  outStream:=TBufferedFS.Create(FilepathOut,fmcreate);
  try
    DecompressStream(inStream,outStream);
  finally
    outStream.Free;
    inStream.Free;
  end;
end;
TBufferedFS könnte auch ein TFileStream sein.

Nun wollte ich einen string in einen tmemorystream packen den dann komprimieren (bzw den inhalt) und einen komprimierten string zurückerhalten.

leider klappt das alles nich so :)

um den string in den stream und wieder rauszubekommen habe diese funktionen bennutzt

mfg smallsmoker

edit:

ich habe es bislang so versucht:

Delphi-Quellcode:
function TLZMAAlone.CompressString(str: String): String;
var
  inStream: TStream;
  outStream: TStream;
begin
  inStream := TMemoryStream.Create;
  outStream := TMemoryStream.Create;
  try
    SaveStrToStream(inStream, str);
    CompressStream( inStream, outStream);
    LoadStrFromStream(outStream, result);
  finally
    outStream.Free;
    inStream.Free;
  end;
end;

function TLZMAAlone.DecompressString(str: String): String;
var
  inStream: TStream;
  outStream: TStream;
begin
  inStream := TMemoryStream.Create;
  outStream := TMemoryStream.Create;
  try
    SaveStrToStream(inStream, pchar(str));
    DecompressStream( inStream, outStream);
    LoadStrFromStream(outStream, result);
  finally
    outStream.Free;
    inStream.Free;
  end;
end;
da gibt es leider einen ereaderror beim aufrufen von LoadStrFromStream

nicodex 8. Dez 2008 21:40

Re: LZMA SDK - String in Stream packen
 
Wie wäre es mit einem TStringStream?

ps: Könnte sein, dass du einfach vergessen hast nach (De)CompressStream die Position des Ausgabe-Streams wieder zurückzusetzen.

smallsmoker 8. Dez 2008 21:46

Re: LZMA SDK - String in Stream packen
 
nein ich hab da ewig mit den positions rumgespielt :/ auch tstringstream hab ich mir angeguckt (da das vorhin in nem anderen thead aufgetaucht is) nur leider wüsste ich nich wie ich das einsetzen soll ...

edit1: die exeption kommt schon wenn ich nur packe und dann den "gepackten" string ausgeben will (bzw davor)

edit2: ich hab mal bei zlibex reingeguckt die machen das mit pchars vieleicht geht das nich wenn ich das als string reinlade .. ?

smallsmoker 10. Dez 2008 16:06

Re: LZMA SDK - String in Stream packen
 
*push*

hatt sich noch keiner mit der lzma sdk auseinandergesetzt ?
wenn doch wie kann man einen string mit lzma packen ? muss ja nicht mit meiner methode sein :)
mfg smallsmoker

alzaimar 10. Dez 2008 17:02

Re: LZMA SDK - String in Stream packen
 
Delphi-Quellcode:
function TLZMAAlone.CompressString(str: String): String;
var
  inStream: TStringStream;
  outStream: TStringStream;
begin
  inStream := TStringStream.Create(str);
  outStream := TMemoryStream.Create('');
  try
    CompressStream(inStream, outStream);
    Result := outStream.DataString;
  finally
    outStream.Free;
    inStream.Free;
  end;
end;

function TLZMAAlone.DecompressString(str: String): String;
var
  inStream: TStringStream;
  outStream: TStringStream;

begin
  inStream := TStringStream.Create(str);
  outStream := TMemoryStream.Create('');
  try
    DecompressStream(inStream, outStream);
    Result := outStream.DataString;
  finally
    outStream.Free;
    inStream.Free;
  end;
end;
Egal was CompressStream/DecompressStream macht. Das sollte 'eigentlich' funktionieren.

smallsmoker 10. Dez 2008 17:11

Re: LZMA SDK - String in Stream packen
 
so habs selber geschafft :)
Delphi-Quellcode:
function ReadStrFromStream(const Stream: TStream): String;
begin
  Stream.Position := 0;
  SetLength(result,Stream.Size);
  Stream.ReadBuffer( pointer(result)^ , Stream.Size);
end;
edit1: ich guck mir das mal an mit datastring

edit2: danke alzaimar .datastring klappt gut :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:57 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