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.
BinaryReader/Writer mit MemoryStream braucht man wenn man die Buffer zu Strukturen und umgekehrt codieren möchte.
Bau dir ne Telegramm- Klasse mit properties für die Inhaltsteile des telegramms, sowie Methoden zum serialisieren und deserialisieren zu und von Arrays.
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.
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.
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
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???
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...
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?
https://stackoverflow.com/questions/1446547/how-to-convert-an-object-to-a-byte-array-in-c-sharp ... war der erste Treffer in Google. #2: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/serialization/ #3: https://docs.microsoft.com/de-de/dotnet/standard/serialization/basic-serialization merciless
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 | }
|
Im Netz finde ich kein richtig gutes Beispiel da sgenau sowas deominstriert.
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
Hast du schon ne Lösung? Wenn nicht schreib ich dir ein Programm. Ich mach genau das fast jeden Tag
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.