Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   TidBytes in ein File schreiben (https://www.delphipraxis.net/198001-tidbytes-ein-file-schreiben.html)

Kostas 25. Sep 2018 19:59

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:
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;
Gruß Kostas

himitsu 25. Sep 2018 20:23

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

Kostas 25. Sep 2018 20:30

AW: TidBytes in ein File schreiben
 
Hallo himitsu,

wieder einmal ein Volltreffer.

Delphi-Quellcode:
Data.WriteBuffer(dm1.FGlobalBuffer[0], Length(dm1.FGlobalBuffer));
Das funktioniert einwandfrei. Wieso weißt du sowas. :shock:
Herzlichen Dank

himitsu 25. Sep 2018 20:34

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 Delphi-Referenz durchsuchenTFile.WriteAllBytes



Und k.A. wo/wie dein FGlobalBuffer gefüllt wird,
aber eventuell wäre auch ein Delphi-Referenz durchsuchenTStringStream statt dem ByteArray eine Überlegung wert.

Kostas 25. Sep 2018 20:43

AW: TidBytes in ein File schreiben
 
Danke für den Hinweis, ich habe auf TFileStream umgestellt.

Perfekt, danke.

Kostas 25. Sep 2018 20:57

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 00:12 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