AGB  ·  Datenschutz  ·  Impressum  







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

String in Stream speichern

Ein Thema von d1ng0d0gt0r · begonnen am 30. Jan 2008 · letzter Beitrag vom 31. Jan 2008
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von wicht
wicht

Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
 
Delphi XE Professional
 
#11

Re: String in Stream speichern

  Alt 30. Jan 2008, 23:35
Hi,

Zitat:
Zweitens solltest du dir mal überlegen, warum du eigentlich N abgespeichert hast, wenn du es nicht ausliest.
Also.. mehr so:

Delphi-Quellcode:
var
  len: integer;
  s: string
begin
  stream.read(len, sizeof(integer)); <<<----
  setlength(s, len); <<<----
  stream.read(s[1], len);
end;
http://streamwriter.org

"I make hits. Not the public. I tell the DJ’s what to play. Understand?"
  Mit Zitat antworten Zitat
Benutzerbild von d1ng0d0gt0r
d1ng0d0gt0r

Registriert seit: 24. Jan 2008
23 Beiträge
 
Delphi 2007 Enterprise
 
#12

Re: String in Stream speichern

  Alt 30. Jan 2008, 23:54
Danke so gehts.
Übung macht den Meister.
44 65 66 2E 20 45 78 74 65 78 6F 3A 20 47 65 6C 64 20 61 62 6E 65 68 6D 65 6E 2C 20 62 65 74 72 FC 67 65 6E 2E
  Mit Zitat antworten Zitat
WS1976
(Gast)

n/a Beiträge
 
#13

Re: String in Stream speichern

  Alt 31. Jan 2008, 06:38
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
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

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

Re: String in Stream speichern

  Alt 31. Jan 2008, 08:51
Ich hab mir das hier in meine Toolsammlung geschmissen.
Delphi-Quellcode:
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;
Heute würde man das mit einem Class Helper erledigen, der die TStream-Klasse erweitert.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#15

Re: String in Stream speichern

  Alt 31. Jan 2008, 12:27
@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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 19:20 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