![]() |
TidBytes in ein File schreiben
Hallo Zusammen,
dm1.FGlobalBuffer ist vom Type TIdBytes das wiederum ein Array of Bytes ist. Wenn ich mir ein break point auf Data.WriteBuffer setze und dm1.FGlobalBuffer anschaue, sind die Bytes 100% korrekt. Öffne ich das File GlobalBuffer.Log nach dem Schreiben mit einem hex Editor stehen darin völlig andere Bytes. Probiert habe ich auch Data.Write ist kein Unterschied. Hat jemand eine Idee?
Delphi-Quellcode:
Gruß Kostas
procedure TForm1.acWriteGlobalBufferToFileExecute(Sender: TObject);
var Data: TMemoryStream; begin Data := TMemoryStream.Create; try Data.WriteBuffer(dm1.FGlobalBuffer, Length(dm1.FGlobalBuffer)); Data.SaveToFile('GlobalBuffer.Log'); finally Data.Free; end; end; |
AW: TidBytes in ein File schreiben
Ich wette du bekommst das falsche WriteBuffer, denn es gibt eines mit TBytes und eines mit Pointer/VAR-Parameter.
Aber das hätte dir auch der Debugger verraten, wenn du ihn gefragt hättest. :zwinker: Da TidBytes und TBytes seit vielen Jahren immernoch nicht kompatibel/"identisch" sind, wird also nicht die gewünschte Version mit TBytes verwendet. * deine Variable nach TBytes casten * oder als Pointer übergeben (der Anfang des Arrays, also das erste Feld)
Delphi-Quellcode:
Data.WriteBuffer(dm1.FGlobalBuffer[0], Length(dm1.FGlobalBuffer)); // bei Funktionen mit typlosem "var Data"
oder Data.WriteBuffer(@dm1.FGlobalBuffer[0], Length(dm1.FGlobalBuffer)); // bei Funktionen mit Pointer als Data-Parameter |
AW: TidBytes in ein File schreiben
Hallo himitsu,
wieder einmal ein Volltreffer.
Delphi-Quellcode:
Das funktioniert einwandfrei. Wieso weißt du sowas. :shock:
Data.WriteBuffer(dm1.FGlobalBuffer[0], Length(dm1.FGlobalBuffer));
Herzlichen Dank |
AW: TidBytes in ein File schreiben
Vor vielen Jahren selber drauf reingefallen. :stupid:
PS: TFileStream statt TMemoryStream, denn wozu erst "sinnlos" in den RAM anstatt gleich in die Datei schreiben? außerdem ![]() Und k.A. wo/wie dein FGlobalBuffer gefüllt wird, aber eventuell wäre auch ein ![]() |
AW: TidBytes in ein File schreiben
Danke für den Hinweis, ich habe auf TFileStream umgestellt.
Perfekt, danke. |
AW: TidBytes in ein File schreiben
Hallo himitsu,
ich noch eine Frage in diesem Zusammenhang. Ich habe einen TIdTCPServer. Sobald sich ein Client connected wird dem AContext.Data eine Object erzeugt und übergeben. Dieses Object hat einen Buffer vom Type TIdBytes. Sobald der Event TCPServerExecute feuert, werden alle Bytes abgerufen und erst einmal in einen Buffer geschrieben. Es geht mir um das schreiben des Buffers. Kann man das so machen oder gibt es einen besseren Weg? Es scheint soweit zu funktionieren.
Delphi-Quellcode:
TFahrzeug(AContext.Data).FReceiveBuffer := TFahrzeug(AContext.Data).FReceiveBuffer + LBuffer;
Delphi-Quellcode:
function ReceiveBuffer(AContext: TIdContext; var ABuffer: TIdBytes) : Boolean; overload; var LSize: LongInt; begin Result := True; try LSize := AContext.Connection.IOHandler.ReadLongInt(); AContext.Connection.IOHandler.ReadBytes(ABuffer, LSize, False); except Result := False; end; end; procedure Tdm1.IdTCPServer1Execute(AContext: TIdContext); var LBuffer: TIdBytes; var Fahrzeug : TFahrzeug; begin with AContext.Connection.IOHandler do try // ReadTimeout := 90000; if not(ReceiveBuffer(AContext, LBuffer)) then begin TIdNotify.NotifyMethod(ShowCannotGetDataErrorMessage); Exit; end else begin try Fahrzeug := TFahrzeug(AContext.Data); except TIdNotify.NotifyMethod(ShowCannotGetDataErrorMessage); Fahrzeug := nil; end; if Assigned(Fahrzeug) then begin TFahrzeug(AContext.Data).FReceiveBuffer := TFahrzeug(AContext.Data).FReceiveBuffer + LBuffer; end; end; except on E: Exception do begin WriteLn('500-Unknown Internal Error'); WriteLn('500 ' + StringReplace(E.Message, EOL, ' ', [rfReplaceAll])); raise; end; end; end; Gruß Kostas |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:34 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