Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Inhalt von TMemoryStream als String auslesen? (https://www.delphipraxis.net/125834-inhalt-von-tmemorystream-als-string-auslesen.html)

LDericher 12. Dez 2008 17:02


Inhalt von TMemoryStream als String auslesen?
 
Hallo DP!

Ich krieg' noch zu viel bei dem Mist :D
Ich versuche wie besessen, ein Bild, das ich in einem TMemoryStream habe, in einen String zu packen - komm aber nicht gut dabei weg. Hat wer nen akuten Einfall?
(->Problem: Inhalt eines TMemoryStream in einen string laden)

Ich habe es auch schon mit TStringStream versucht - Geht nicht!

Danke im Voraus für eine Antwort,
Euer LDer.

DeddyH 12. Dez 2008 17:07

Re: Inhalt von TMemoryStream als String auslesen?
 
Wieso willst Du ein Bild in einen String packen? Da kann doch nichts Gescheites bei herauskommen :gruebel:

turboPASCAL 12. Dez 2008 17:10

Re: Inhalt von TMemoryStream als String auslesen?
 
@DeddyH,
http://www.delphipraxis.net/internal...t.php?t=148264

smallsmoker 12. Dez 2008 17:14

Re: Inhalt von TMemoryStream als String auslesen?
 
pack die daten doch in einen tstringstream und benutze dann tstringstream.datastring :)

DeddyH 12. Dez 2008 17:15

Re: Inhalt von TMemoryStream als String auslesen?
 
Aso, klingt aber ein bisschen nach "von hinten durch die Brust ins Auge".

nicodex 12. Dez 2008 17:16

Re: Inhalt von TMemoryStream als String auslesen?
 
Delphi-Quellcode:
var
  S: AnsiString;
  Buffer: TMemoryStream;
begin
  SetString(S, PAnsiChar(Buffer.Memory), Buffer.Size);
end;

smallsmoker 12. Dez 2008 17:17

Re: Inhalt von TMemoryStream als String auslesen?
 
oder so: link

LDericher 12. Dez 2008 17:22

Re: Inhalt von TMemoryStream als String auslesen?
 
Kann mir denn wirklich NIEMAND helfen?
Ausnahmsweise suche ich mal eine konkrete LÖSUNG oder einen quasi perfekten ANSATZ, nicht nur irgendeinen...
Ich bin hier am Verzweifeln! :pale:
Kann nicht mal wer negaH rufen? Unser Overkiller kann das doch bestimmt! :D
Danke.

LDer.

PS: Eure Lösungsansätze da sind zwar bestimmt nett gemeint, aber ich sagte bereits:
TStringStream FUNKTIONIERT NICHT!
Ich hab es ja versucht:

Delphi-Quellcode:
function BitmapToString(Input:TBitmap):string;
var
  P:TStringStream;
  CurChar:int64;
begin
P:=TStringStream.Create('');
Input.SaveToStream(P);
Result:='';
P.Position:=0;
Result:=P.DataString;
P.Free;
end;
Und nein, ICH WILL KEINEN STRING IN EINEN STREAM LADEN!
ICH HABE EINEN STREAM MIT EINEM BILD! ICH WILL EINEN STRING!
RUFT NEGAH! DER KANNS! BESTIMMT!

Add:
Das funktioniert auch nicht, da bekomm nur 5 Zeichen raus:
Delphi-Quellcode:
function BitmapToString(Input:TBitmap):string;
var
  P:TMemoryStream;
  CurChar:int64;
begin
P:=TMemoryStream.Create;
Input.SaveToStream(P);
Result:='';
P.Position:=0;
SetString(Result, PAnsiChar(P.Memory), P.Size);
P.Free;
end;

DeddyH 12. Dez 2008 17:23

Re: Inhalt von TMemoryStream als String auslesen?
 
Hast Du mal den Ansatz von Nico versucht?

P.S.: Deine CapsLock-Taste scheint defekt zu sein.

LDericher 12. Dez 2008 17:30

Re: Inhalt von TMemoryStream als String auslesen?
 
Zitat:

Zitat von DeddyH
Hast Du mal den Ansatz von Nico versucht?

Ja habe ich... siehe voriger Post.

Zitat:

Zitat von DeddyH
P.S.: Deine CapsLock-Taste scheint defekt zu sein.

Nein, ich musste einfach mal ausrasten ;) Ich habe nun schon so viele Ansätze vorgeworfen bekommen, die entweder nicht funktioniert haben - ist ja nicht schlimm - oder die einfach total am Geforderten vorbeigegangen sind, wie der vorschlag "TStringStream"...

Und ich bin Vertreter der Theorie, dass sich solche Ausbrüche vermeiden ließen, wenn die User erst mal lesen, ggf. Fragen stellen und DANN erst ihren Senf dazugeben würden...

Der LDer.

Edith: Dazu kommt noch, dass ich es komfortabler finde, in Großbuchstaben zu schreiben, als BBCodes zu verwenden -> so fett und so :D Naja egal, so oder so musste das raus ;)

DeddyH 12. Dez 2008 17:35

Re: Inhalt von TMemoryStream als String auslesen?
 
Also, Du hast einen MemoryStream mit einem Bild drin? Dann sollte Nicos Code doch mit einer kleinen Änderung funktionieren.
Delphi-Quellcode:
function StreamToString(const Buffer: TMemoryStream): AnsiString;
begin
  SetString(Result, PAnsiChar(Buffer.Memory), Buffer.Size);
end;
Falls nicht, lass Dir doch mal Buffer.Size usw. mal ausgeben.

nicodex 12. Dez 2008 17:40

Re: Inhalt von TMemoryStream als String auslesen?
 
Zitat:

Zitat von Superwinger
Das funktioniert auch nicht, da bekomm nur 5 Zeichen raus

Lerne mit Delphi umzugehen.
(der Debugger interpretiert das erste #0 als Ende eines PChars, lass dir Length(Result) ausgeben)

Klaus01 12. Dez 2008 17:44

Re: Inhalt von TMemoryStream als String auslesen?
 
Zitat:

Zitat von Superwinger
...
Das funktioniert auch nicht, da bekomm nur 5 Zeichen raus:
...

Guten Abend,

kann das vielleicht daran liegen, dass das 6 Zeichen ein #0 Zeichen war/ist?
Ich denke mal, das Strings mit diesen Zeichen nicht so wollen.

Kann man denn mit TWinSock keine binäre Zeichen übertragen?
Muss man dazu Strings nehmen?
Streams oder Buffer wären da wohl angebrachter.

Grüße
Klaus

LDericher 12. Dez 2008 17:48

Re: Inhalt von TMemoryStream als String auslesen?
 
An DeddyH:
Geht nicht.
Wie vorhergesehen.
Und wenn ich mir das als ShowMessage ausgeben lasse, kommt eine Message, die ca. 100 Meter breit und 15cm hoch ist, auf meinem Bildschirm ans Licht. Nur, dass die einzigen sinnvollen Zeichen darin "BMfu" - am Anfang - sind, der Rest ist in einem schlichten Mausgrau gehalten.
Und Stream.Size liefert einen Wert um die 30000, also im gesunden Bereich.

LDer.

P.S.: Ich bemerke gerade, dass der String definitiv nicht nur aus Leerzeichen besteht. Werde der Spur mal folgen.

Klaus01 12. Dez 2008 17:53

Re: Inhalt von TMemoryStream als String auslesen?
 
Zitat:

Zitat von Superwinger

P.S.: Ich bemerke gerade, dass der String definitiv nicht nur aus Leerzeichen besteht. Werde der Spur mal folgen.

Wenn Du dir mal die Mühe machst, das Bild (bmp) mit einem HexEditor (HxD) anzuschauen
wirst Du merken, dass es sehr viele Zeichen enthält die in einem Bereich liegen
welche nicht darstellbar sind.
Deswegen denke ich, es ist die falsche Methode ein Bild per String zu übertragen.

Grüße
Klaus

DeddyH 12. Dez 2008 17:57

Re: Inhalt von TMemoryStream als String auslesen?
 
Zitat:

Zitat von Klaus01
Deswegen denke ich, es ist die falsche Methode ein Bild per String zu übertragen.

Siehe #2 ;)

inherited 12. Dez 2008 18:03

Re: Inhalt von TMemoryStream als String auslesen?
 
Zitat:

Zitat von DeddyH
Also, Du hast einen MemoryStream mit einem Bild drin? Dann sollte Nicos Code doch mit einer kleinen Änderung funktionieren.
Delphi-Quellcode:
function StreamToString(const Buffer: TMemoryStream): AnsiString;
begin
  SetString(Result, PAnsiChar(Buffer.Memory), Buffer.Size);
end;
Falls nicht, lass Dir doch mal Buffer.Size usw. mal ausgeben.

Würde das nicht nach dem ersten 0-Byte spätestens schiefgehen?

Vielleicht soltle man das Bild lieber sicherheitshalber in Hex-Strings konvertieren. ist zwar größer, aber schöner.
Der Ansatz wurde auch schon genannt
Delphi-Quellcode:
function BitmapToString(b: TBitmap): String;
var ms: TMemoryStream;
  a: Int64;
  buffer: Array[0..1024] of Byte;
begin
  result := '';
  ms := TMemoryStream.Create;
  try
    b.SaveToStream(ms);
    ms.Seek(0, soFromBeginning);
    a := 0;
    while a <> 0 do
    begin
      a := ms.read(buffer[0], length(buffer));
      for i := 0 to a-1 do
      begin
        result := result + IntToHex(buffer[i], 2);
      end;
    end;
  finally
    ms.Free;
  end;
end;
(ungetestet)

LDericher 12. Dez 2008 18:33

Re: Inhalt von TMemoryStream als String auslesen?
 
Und wie wandle ich denn Hex-Werte zurück um nach Integer?

Hier im Forum suchenHexadezimal AND Dezimal AND umwandeln

So? :D

LDericher 12. Dez 2008 18:56

Re: Inhalt von TMemoryStream als String auslesen?
 
Zitat:

Zitat von inherited
Delphi-Quellcode:
function BitmapToString(b: TBitmap): String;
var ms: TMemoryStream;
  a: Int64;
  buffer: Array[0..1024] of Byte;
begin
  result := '';
  ms := TMemoryStream.Create;
  try
    b.SaveToStream(ms);
    ms.Seek(0, soFromBeginning);
    a := 0;
    while a <> 0 do
    begin
      a := ms.read(buffer[0], length(buffer));
      for i := 0 to a-1 do
      begin
        result := result + IntToHex(buffer[i], 2);
      end;
    end;
  finally
    ms.Free;
  end;
end;

Funtioniert so weit, nach kleinen Änderungen.
Habe dazu mal 'ne inverse Funktion gebastelt, nur die will nicht ganz klappen:
Delphi-Quellcode:
function StringToBitmap(Input:string):TBitmap;
var
  P:TMemoryStream;
  I:integer;
  B:Byte;
begin
P:=TMemoryStream.Create;
I:=1;
while(I<=Length(Input))do
     begin
     B:=StrToInt('$'+copy(Input, I, 2));
     P.Write(B, 1);
     inc(I, 2);
     end;
Result:=TBitmap.Create;
Result.LoadFromStream(P);
P.Free;  
end;
Finde meinen Fehler nicht...

LDericher 12. Dez 2008 19:15

Re: Inhalt von TMemoryStream als String auslesen?
 
http://www.delphipraxis.net/internal...=975595#975595

Gelöst.


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