AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

LZMA SDK - String in Stream packen

Ein Thema von smallsmoker · begonnen am 8. Dez 2008 · letzter Beitrag vom 10. Dez 2008
Antwort Antwort
Benutzerbild von smallsmoker
smallsmoker

Registriert seit: 12. Nov 2007
Ort: Duisburg
283 Beiträge
 
#1

LZMA SDK - String in Stream packen

  Alt 8. Dez 2008, 20:17
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
  Mit Zitat antworten Zitat
Benutzerbild von nicodex
nicodex

Registriert seit: 2. Jan 2008
Ort: Darmstadt
286 Beiträge
 
Delphi 2007 Professional
 
#2

Re: LZMA SDK - String in Stream packen

  Alt 8. Dez 2008, 21:40
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.
  Mit Zitat antworten Zitat
Benutzerbild von smallsmoker
smallsmoker

Registriert seit: 12. Nov 2007
Ort: Duisburg
283 Beiträge
 
#3

Re: LZMA SDK - String in Stream packen

  Alt 8. Dez 2008, 21:46
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 .. ?
  Mit Zitat antworten Zitat
Benutzerbild von smallsmoker
smallsmoker

Registriert seit: 12. Nov 2007
Ort: Duisburg
283 Beiträge
 
#4

Re: LZMA SDK - String in Stream packen

  Alt 10. Dez 2008, 16:06
*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
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: LZMA SDK - String in Stream packen

  Alt 10. Dez 2008, 17:02
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von smallsmoker
smallsmoker

Registriert seit: 12. Nov 2007
Ort: Duisburg
283 Beiträge
 
#6

Re: LZMA SDK - String in Stream packen

  Alt 10. Dez 2008, 17:11
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
  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 14:04 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