AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke TidBytes in ein File schreiben
Thema durchsuchen
Ansicht
Themen-Optionen

TidBytes in ein File schreiben

Ein Thema von Kostas · begonnen am 25. Sep 2018 · letzter Beitrag vom 25. Sep 2018
Antwort Antwort
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.095 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

TidBytes in ein File schreiben

  Alt 25. Sep 2018, 20:59
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.056 Beiträge
 
Delphi 12 Athens
 
#2

AW: TidBytes in ein File schreiben

  Alt 25. Sep 2018, 21:23
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.

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
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (25. Sep 2018 um 21:33 Uhr)
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.095 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: TidBytes in ein File schreiben

  Alt 25. Sep 2018, 21:30
Hallo himitsu,

wieder einmal ein Volltreffer.

Data.WriteBuffer(dm1.FGlobalBuffer[0], Length(dm1.FGlobalBuffer)); Das funktioniert einwandfrei. Wieso weißt du sowas.
Herzlichen Dank
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.056 Beiträge
 
Delphi 12 Athens
 
#4

AW: TidBytes in ein File schreiben

  Alt 25. Sep 2018, 21:34
Vor vielen Jahren selber drauf reingefallen.


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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.095 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: TidBytes in ein File schreiben

  Alt 25. Sep 2018, 21:43
Danke für den Hinweis, ich habe auf TFileStream umgestellt.

Perfekt, danke.
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.095 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: TidBytes in ein File schreiben

  Alt 25. Sep 2018, 21:57
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.
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
  Mit Zitat antworten Zitat
Antwort Antwort


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 21:35 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