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:
TBufferedFS könnte auch ein TFileStream sein.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; 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:
da gibt es leider einen ereaderror beim aufrufen von LoadStrFromStream
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; |
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. |
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 .. ? |
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 |
Re: LZMA SDK - String in Stream packen
Delphi-Quellcode:
Egal was CompressStream/DecompressStream macht. Das sollte 'eigentlich' funktionieren.
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; |
Re: LZMA SDK - String in Stream packen
so habs selber geschafft :)
Delphi-Quellcode:
edit1: ich guck mir das mal an mit datastring
function ReadStrFromStream(const Stream: TStream): String;
begin Stream.Position := 0; SetLength(result,Stream.Size); Stream.ReadBuffer( pointer(result)^ , Stream.Size); end; 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