![]() |
Stream-Problem
Hallo,
ich habe mal wieder ein ganz spezielles Problem ;-) Ich muss im Stream eine Variable übergeben, die z.B. durch eine Codierungsfunktion den Wert "#$1F'ÇøẢx߬" enthält. Mit
Delphi-Quellcode:
gibt es aber Probleme.
Buffer := TMemoryStream.Create;
size := Length(xyz^.Wert); Buffer.Write(size, SizeOf(Size)); Buffer.Write(PChar(Trim(xyz.Wert))^, size); Die
Delphi-Quellcode:
ergibt nämlich statt #$1F'ÇøẢx߬ nur noch #$1F
PChar(Trim(xyz.Wert))^
Lass ich die Dereferenzierung ^ weg, klappt es. Wie kann ich jetzt aber den Wert in den Stream schreiben? Danke für jeden mögliche Hinweis. Schon einmal ein schönes Wochenende wünscht Amigage |
Re: Stream-Problem
PChar hört bei einem Nullbyte auf. Wenn du also einen String kodierst und ein Nullbyte drinne vorkommt, dann vergiss es mit PChar.
Delphi-Quellcode:
/EDIT: Fehler beseitigt. Mensch ist das peinlich - noch so dumme Fehler...
Var
s : String; lSize: Integer; lBuffer: TStream; Begin lBuffer := TMemoryStream.Create; Try s := Trim(xyz.Wert); lSize := Length(s); lBuffer.Write(lSize, SizeOf(lSize)); lBuffer.Write(s[1], lSize); Finally lBuffer.Free; End; End; Anmerkung: Das Trim bei einem verschlüsselten String, der wahrscheinlich mehr binäre Daten enthält als lesbaren Text, war für mich auch schon unverständlich - aber wenn der "Kunde" es so wünscht... |
Re: Stream-Problem
Hallo,
du schreibst einen durch Trim möglicherweise gekürzten String in seiner Originallänge in den Stream? :gruebel: Ich würde es folgendermaßen versuchen:
Delphi-Quellcode:
Der Code zum Lesen sieht dann so aus:
Buffer := TMemoryStream.Create;
s := Trim(xyz.Wert); size := Length(s); Buffer.Write(size, SizeOf(size)); if (size > 0) then Buffer.Write(s[1], size);
Delphi-Quellcode:
@Muetze1
Buffer.Read(size, SizeOf(Size));
SetLength (xyz^.Wert, size); if (size > 0) then Buffer.Read(xyz^.Wert[1], size); Das erste Zeichen im String hat den Index 1. :wink: Gruß Hawkeye |
Re: Stream-Problem
IMO, ist das, das Beste lösung:
Delphi-Quellcode:
type
TmyFileStream = class(TFileStream) procedure WriteString( myString:string ); procedure WriteInteger( myInteger:Integer ); procedure WriteSingle( mySingle:Single ); procedure WriteDouble( myDouble:Double); function ReadSingle():Single; function ReadDouble():Double; function ReadString():string; function ReadInteger():Integer; end; implementation { TmyFileStream } function TmyFileStream.ReadDouble: Double; begin Read( Result, SizeOf( Double ) ); end; function TmyFileStream.ReadInteger: Integer; begin Read( Result, SizeOf( Integer ) ); end; function TmyFileStream.ReadSingle: Single; begin Read( Result, SizeOf( Single ) ); end; function TmyFileStream.ReadString: string; var len:Integer; begin Read( len, SizeOf(len) ); SetLength( Result, len ); Read( Result[1], len ); end; procedure TmyFileStream.WriteDouble(myDouble: Double); begin Write( myDouble, SizeOf(myDouble) ); end; procedure TmyFileStream.WriteInteger(myInteger: Integer); begin Write( myInteger, SizeOf(myInteger) ); end; procedure TmyFileStream.WriteSingle(mySingle: Single); begin Write( mySingle, SizeOf(mySingle) ); end; procedure TmyFileStream.WriteString(myString: string); var len:Integer; begin len := Length( myString ); Write( len, SizeOf(len) ); Write( myString[1], Len ); end; |
Re: Stream-Problem
Zitat:
Die Methoden "ReadString" und "WriteString" machen Probleme, falls der String leer ist. Deswegen die Größe vor dem Laden und Speichern nochmal kontrollieren:
Delphi-Quellcode:
So sollte es besser sein.
function TmyFileStream.ReadString: string;
var len:Integer; begin Read( len, SizeOf(len) ); SetLength( Result, len ); if (len > 0) then Read( Result[1], len ); end; procedure TmyFileStream.WriteString(myString: string); var len:Integer; begin len := Length( myString ); Write( len, SizeOf(len) ); if (len > 0) then Write( myString[1], Len ); end; Gruß, pszopp |
Re: Stream-Problem
Zitat:
Delphi-Quellcode:
, denn falls len = 0 wird in Stream sowieso nichts geschrieben/gelesen.
if len > 0 then
|
Re: Stream-Problem
Jo, die Überprüfung ist unnötig.
Noch eine Anmerkung: Alle Routinen die man hier sieht, sind eigentlich unnötig. Nutzt doch einfach den TReader/TWriter.
Delphi-Quellcode:
beim TReader entsprechend.
Begin
lStream := TFileStream.Create(...); Try lHandler := TWriter.Create(lStream, 4096); Try lHandler.WriteIdent(s); lHandler.WriteInteger(24); ... Finally lHandler.Free; End; Finally lStream.Free; End; End; |
Re: Stream-Problem
Zitat:
Schließlich wird dieser Pointer der Methode übergeben. Auch wenn dann nichts gestreamt wird. Gruß, pszopp |
Re: Stream-Problem
Ok, ich nehme alles zurück und behaupte das Gegenteil: Die Abfrage ist doch nicht überflüssig. Der Pointer wäre illegal und der Index ist auch zu groß. Bei eingeschalteter Bereichsprüfung würde somit schon eine Exception kommen.
|
Re: Stream-Problem
Zitat:
Danke für die schnelle Hilfe. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:27 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 by Thomas Breitkreuz