C# Telegramm definieren

Gast #6738083
Lesenswert?

Hallo,

für eine UDP Kommunikation möchte ich in C# ein Tool entwickeln, mit dem 
ich ein vorhandenes Datentelegramm versenden möchte. Nun ist es so dass 
ich das nicht als string übergeben möchte sondern es soll ein Telegramm 
definiert werden das dann auch befüllt wird und anschließend per udp 
versendet werden soll. In C# bin nich nun etwas ratlos wie man da 
vorgeht.
(Firma: egal) #6738100
Lesenswert?

CSharp_User schrieb:
> un ist es so dass
> ich das nicht als string übergeben möchte sondern es soll ein Telegramm
> definiert werden das dann auch befüllt wird und anschließend per udp
> versendet werden soll.

Du solltest erstmal deine Private Datenstruktur von der Übertragung 
gedanklich trennen. Da sind zwei paar Schuhe.

UDP überträgt einfach eine angegebene Anzahl von Bytes. Was diese Bytes 
bedeuten ist der Übertragung völlig egal. Damit kannst du dein Telegramm 
auch als Bildformat übertragen, steht dir alles völlig frei.

Über die Bedeutung des Inhaltes müssen sich nur nur die 
Sende-Application und die Empfangs-Application einig sein.
Gast #6738105
Lesenswert?

Danke für den Link. Das bringt mir für mein Anliegen nichts. Ich brauche 
kein udp Service.

Aufbau Telegramm:

Startbyte
Length Data
Checksum
Data (dynamisch, ist nicht immer gleich groß, je nach Telegrammtyp)
Endbyte

@Dunno: Ich bräuchte da ein kleines Beispiel das mir zeigt wie das genau 
funktioniert.
#6738231
Lesenswert?

CSharp_User schrieb:
> @Dunno: Ich bräuchte da ein kleines Beispiel das mir zeigt wie das genau
> funktioniert.
Der Link, den Stephan gepostet hat, führt zu einer Seite,
auf der 2 Mini-Programme aufgelistet sind. Das eine
horcht am UDP-Port und das andere sendet was über UDP.
Wenn du das verstanden hast, baust du dir eine ganz
normale Klasse und googelst danach, wie man die in
einen Bytestream serialisieren kann, um diesen dann über
UDP zu senden. Der Empfänger muss den Bytestream wieder
deserialisieren und hat dann ein Objekt deiner Klasse
zur Verfügung.

merciless
Gast #6738342
Lesenswert?

IT-Abteilung schrieb:

> Warum willst du es dann unbedingt in dieser Pseudo-Programmiersprache
> machen???

Wieso Pseudo? C# ist eine vollwertige, sichere und relativ einfach 
benutzbare Sprache.

Das Einzige, was man C# vorwerfen könnte, ist die enge Anlehnung der 
Syntax an C'ischen Dreck wie C selber und C++.

Aber: erstens hat C# diese enge Anlehnung an die unsäglich schlecht 
lesbare C/C++-Syntax mit vielen anderen Sprechen gemeinsam und zweites 
macht C# wenigstens nicht den Kardinalfehler von C++: zusammen mit der 
Syntax auch den ganzen historischen (und hochgradig unsicheren) Gammel 
von C zu übernehmen.

Also, wennschon Hochsprache im C-Style, dann C#. Besser wäre VB.net, das 
ist viel besser lesbar und kann (mit ganz wenigen Ausnahmen) dasselbe 
leisten wie C#. Es fehlt eigentlich nur "unsafe". Das allerdings ist 
genau das, was man ja sowieso immer vermeiden möchte, wenn auch nur 
irgendwie möglich...
Gast #6740742
Lesenswert?

Hi, ich habe mal eine Klasse definiert:
1
        public class Telegram
2
        {
3
            public byte Start { get; set; }
4
            public byte[] Data { get; set; }
5
            public byte End { get; set; }
6
        }
7

8
        public static class DatenSerialisierer
9
        {
10
            public static byte[] Serialisiere(Telegram daten)
11
            {
12
                byte[] buffer = BitConverter.GetBytes(daten.Start)
13
                    .Concat(BitConverter.GetBytes(daten.Data))
14
                    .Concat(BitConverter.GetBytes(daten.End))
15
                    .ToArray();
16

17
                return buffer;
18
            }
19
            //---------------------------------------------------------------------
20
            public static Telegram DeSerialisiere(byte[] buffer)
21
            {
22
                Telegram daten = new Telegram();
23

24
                daten.Start = (byte)BitConverter.ToInt32(buffer.Skip(0).Take(0).ToArray(), 0);
25
                daten.Data = (byte)BitConverter.ToInt32(buffer.Skip(4).Take(4).ToArray(), 0);
26
                daten.End = (byte)BitConverter.ToInt32(buffer.Skip(8).Take(8).ToArray(), 0);
27

28
                return daten;
29
            }

Das mit dem byte Array funktioniert aber so nun nicht. Was müsste ich da 
genau tun damit ich auch ein byte Array in das Telegramm mitaufnehmen 
kann?
Gast #6740834
Lesenswert?

Danke.

Ich habe mal diese Funktion noch bei mir eingebaut:
1
        public static byte[] ObjectToByteArray(Object obj)
2
        {
3
            BinaryFormatter bf = new BinaryFormatter();
4
            using (var ms = new MemoryStream())
5
            {
6
                bf.Serialize(ms, obj);
7
                return ms.ToArray();
8
            }
9
        }

Allerdings weiss ich nicht wie ich das nun in diesen beiden Funktionen 
einbauen soll?
1
public static class DatenSerialisierer
2
{
3
  public static byte[] Serialisiere(Telegram daten)
4
  {
5
    byte[] buffer = BitConverter.GetBytes(daten.Start)
6
      .Concat(BitConverter.GetBytes(daten.Data))
7
      .Concat(BitConverter.GetBytes(daten.End))
8
      .ToArray();
9
    return buffer;
10
  }
11

12
  //---------------------------------------------------------------------
13
  public static Telegram DeSerialisiere(byte[] buffer)
14
  {
15
    Telegram daten = new Telegram();
16

17
    daten.Start = (byte)BitConverter.ToInt32(buffer.Skip(0).Take(0).ToArray(), 0);
18
    daten.Data = (byte)BitConverter.ToInt32(buffer.Skip(4).Take(4).ToArray(), 0);
19
    daten.End = (byte)BitConverter.ToInt32(buffer.Skip(8).Take(8).ToArray(), 0);
20

21
    return daten;
22
  }
23
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren