![]() |
Re: String in Stream speichern
Hi,
Zitat:
Delphi-Quellcode:
var
len: integer; s: string begin stream.read(len, sizeof(integer)); <<<---- setlength(s, len); <<<---- stream.read(s[1], len); end; |
Re: String in Stream speichern
Danke so gehts. :love:
Übung macht den Meister. |
Re: String in Stream speichern
Hallo,
Ich würde folgende Änderung vorschlagen: um die Länge des Strings nicht zwischenspeichern zu müssen (fürs zurücklesen) benutze einfach: Stream.Size für die Länge des Strings. Das ist zwar die Gesamtlänge des Streams aber so bist du immer auf der sicheren Seite. In deinem Beispiel war die Länge immer = 0, deshalb der Empfangsstring leer. Ans Ende des Codes gehört: stream.free; bitte nicht vergessen. hier der geänderte Code:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Stream: TMemoryStream; S: String; S_S: String; N: LongInt; begin S:= Edit1.Text; N:= Length(S); if N > 0 then begin // Stream -> String String -> Stream Stream:= TMemoryStream.Create; // Stream.Write(N, SizeOf(N)); Stream.Write(S, N); // Stream -> String Stream.Position:= 0; Stream.read(S_S,Stream.Size); end; MessageBox(0, pchar(S_S), 'title', MB_OK); stream.free; end; Grüsse Rainer |
Re: String in Stream speichern
Ich hab mir das hier in meine Toolsammlung geschmissen.
Delphi-Quellcode:
Heute würde man das mit einem Class Helper erledigen, der die TStream-Klasse erweitert.
Procedure WriteString (aStream : TStream; Const aString : String);
Var iLength : Integer; Begin iLength := Length(aString); aStream.WriteBuffer(iLength, SizeOf(iLength)); aStream.Write(Pchar(aString )^, iLength); End; Function ReadString (aStream : TSream); Var iLength : Integer; Begin aStream.ReadBuffer(iLength, SizeOf(iLength)); SetString(Result, PChar(nil), iLength); aStream.ReadBuffer(Pointer(Result)^, iLength); End; |
Re: String in Stream speichern
@WS1976:
- Wenn er den Stream per Socket verschickt (wie er es oben schon macht), dann weiss er ohne die Längenangabe wann der String komplett empfangen wurde. - Dein Code gibt beim Schreiben wie auch beim Lesen den String direkt an und nicht das erste Zeichen mit [1], somit ist bei deinem Code wieder das Ausgangsproblem des Threads enthalten. - Auch du setzt vor dem Auslesen in einen anderen String nicht dessen Länge und zerhackst dir damit deftig den Speicher. Grüße, Thomas |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz