Forum: PC-Programmierung C# Telegramm definieren


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von CSharp_User (Gast)


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.

von Stephan (Gast)


Lesenswert?


von Johannes S. (jojos)


Lesenswert?

BinaryReader/Writer mit MemoryStream braucht man wenn man die Buffer zu 
Strukturen und umgekehrt codieren möchte.

von Dunno.. (Gast)


Lesenswert?

Bau dir ne Telegramm- Klasse mit properties für die Inhaltsteile des 
telegramms, sowie Methoden zum serialisieren und deserialisieren zu und 
von Arrays.

von Irgend W. (Firma: egal) (irgendwer)


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.

von CSharp_User (Gast)


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.

von Dirk K. (merciless)


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

von IT-Abteilung (Gast)


Lesenswert?

CSharp_User schrieb:
> In C# bin nich nun etwas ratlos wie man da
> vorgeht.

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

von c-hater (Gast)


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...

von CSharp_User (Gast)


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?

von Dirk K. (merciless)


Lesenswert?


von CSharp_User (Gast)


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
}

von CSharp_User (Gast)


Lesenswert?

Ich brauche unbedingt den Datentyp byte[] statt string.

von CSharp_User (Gast)


Lesenswert?

Im Netz finde ich kein richtig gutes Beispiel da sgenau sowas 
deominstriert.

von Dirk K. (merciless)


Lesenswert?

Probier doch 
https://stackoverflow.com/questions/1446547/how-to-convert-an-object-to-a-byte-array-in-c-sharp/1446612#1446612, 
da steht doch die fertige Lösung fast schon da.

merciless

von Dario (Gast)


Lesenswert?

Hast du schon ne Lösung? Wenn nicht schreib ich dir ein Programm. Ich 
mach genau das fast jeden Tag

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.