Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi UDPSendBuffer(indy9): Binäre Daten in String buffer Senden? (https://www.delphipraxis.net/110659-udpsendbuffer-indy9-binaere-daten-string-buffer-senden.html)

Rifman 21. Mär 2008 22:31


UDPSendBuffer(indy9): Binäre Daten in String buffer Senden?
 
Hallo zusammen,
ich muss erstmal sagen, dass ich ein neuling in Delphi-Welt bin.
meine Frage ist, wie kann ich binäre Daten in einem String-Buffer senden?
Delphi-Quellcode:
UDPServer.SendBuffer(AHost:String;APort:String,AData:String,Length:Integer);
wie ihr sieht, die Indy-Funktion erwartet hier ein String-Parameter, wie kann ich binäre Daten darein schreiben?
Danke!

sx2008 22. Mär 2008 00:30

Re: UDPSendBuffer(indy9): Binäre Daten in String buffer Send
 
Delphi-Quellcode:
var
 data:sring;
begin
 data := #27#0#0#255; // binäre Daten
 data := data +Chr(15)+Chr(x); // so geht's auch

Rifman 22. Mär 2008 13:02

Re: UDPSendBuffer(indy9): Binäre Daten in String buffer Send
 
Danke für deine Antwort.
Aber muss man jedes Byte manuell reinschreiben, gibt es keine andere Lösung, was ist wenn ich z.B. ein ganze "array[0..512] of byte" darein kopieren will?

Danke.

sx2008 22. Mär 2008 13:46

Re: UDPSendBuffer(indy9): Binäre Daten in String buffer Send
 
Zitat:

Zitat von Rifman
Aber muss man jedes Byte manuell reinschreiben, gibt es keine andere Lösung, was ist wenn ich z.B. ein ganze "array[0..512] of byte" darein kopieren will?

Du kannst auch kopieren; man muss dann aber etwas aufpassen, denn dann wird's Low-Level & "Hardcore"

Delphi-Quellcode:
var
  buffer:array[0..511] of Byte;
  s : string;
begin
  // angenommen in buffer sind schon Daten
  SetLength(s, sizeof(buffer)); // Speicher reservieren
  // jetzt wird's Tricky
  // Move() nimmt eigentlich zwei Zeiger für Quelle und Ziel entgegen
  // man muss bei einem Array das 1. Element angeben
  // bei einem String beginnt die Zählung bei 1
  Move(buffer[0], s[1], sizeof(buffer));
Man muss bei Move() genau aufpassen, was man tut, sonst ist der Speicher kaputt -> Absturz droht
Am Besten, man verwendet nur AnsiStrings als Puffer für binäre Daten.
Das ist angenehmer als diese array of Byte.

Rifman 22. Mär 2008 14:02

Re: UDPSendBuffer(indy9): Binäre Daten in String buffer Send
 
Vielen Dank.
Noch eine Frage, kann man das irgendwie nicht mit TStringStream machen? das wäre vielleicht sicherer was Bereichsprüfung angeht oder?

sx2008 22. Mär 2008 14:19

Re: UDPSendBuffer(indy9): Binäre Daten in String buffer Send
 
Zitat:

Zitat von Rifman
Noch eine Frage, kann man das irgendwie nicht mit TStringStream machen? das wäre vielleicht sicherer was Bereichsprüfung angeht oder?

Ja, das geht auch:
Delphi-Quellcode:
var
  stream : TStringStream;
begin
  stream := TStringStream.Create;
  stream.WriteBuffer(buffer[0], sizeof(buffer)); // buffer ist ein array of byte


  // jetzt kann man
  UDPServer.SendBuffer(AHost:String;APort:String; stream.DataString, stream.Size);

  // oder vielleicht noch eleganter
  stream.Position := 0; // Achtung: Stream muss auf Anfang gesetzt werden
  UDPServer.SendStream(AHost,APort:String, stream);

  stream.Free; // nicht vergessen!

Rifman 22. Mär 2008 14:45

Re: UDPSendBuffer(indy9): Binäre Daten in String buffer Send
 
Sorry für die blöde Frage, der Kompiler findet diesen Fehler "nicht genügend wirkliche Parameter "
und zeigt auf diese Zeile:
Delphi-Quellcode:
stream := TStringStream.Create;
Habe ich etwa was vergessen?

sx2008 22. Mär 2008 14:51

Re: UDPSendBuffer(indy9): Binäre Daten in String buffer Send
 
Zitat:

Zitat von Rifman
Sorry für die blöde Frage, der Kompiler findet diesen Fehler "nicht genügend wirkliche Parameter "
und zeigt auf diese Zeile:
Delphi-Quellcode:
stream := TStringStream.Create;

Achja, TStringStream will im Konstruktor einen Initialisierungswert haben:
Delphi-Quellcode:
stream := TStringStream.Create(''); // mit Leerstring erzeugen

Rifman 22. Mär 2008 15:17

Re: UDPSendBuffer(indy9): Binäre Daten in String buffer Send
 
Super, jetzt zeigt er diesen Fehler nicht mehr aber diesen:
[Fehler] MPDLOG_MAIN.pas(324): Konstantenobjekt kann nicht als Var-Parameter weitergegeben werden
Im Bezug auf die 2.Zeile:
Delphi-Quellcode:
StreamBuffer.WriteBuffer(Bin_Buffer[0], 3);
UDPServer.SendBuffer(IP_Adresse,UDP_PORT,StreamBuffer.DataString,3);
Bin_Buffer ist so definiert:
Delphi-Quellcode:
const
Bin_Buffer :array[0..2] of byte = ( $01,
                                    $02,
                                    $03 );
Ich danke dir vielmals für deine Hilfe.

Rifman 22. Mär 2008 16:29

Re: UDPSendBuffer(indy9): Binäre Daten in String buffer Send
 
Ich habe das Problem gelöst, und zwar ich habe stream.DataString in eine String-Variable zwischengespeichert und sie als Parameter übergegeben.
Jetzt werden die Daten gesendet nur das Problem ist, dass der Inhalt Falsch ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:15 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