Delphi-PRAXiS
Seite 2 von 2     12   

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)

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 14:02 Uhr.
Seite 2 von 2     12   

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