2013-04-06 12 views
5

Ich bin neu in C# binäre und habe eine Frage über den besten Weg, dies zu tun. Ich habe eine Anwendung, die ich kommunizieren möchte, die ein bestimmtes binäres Nachrichtenformat hat. Es muss mit einem Hexadezimalcode beginnen und mit einem Hexadezimalcode BB mit der binären Nachricht dazwischen enden. Was ist der beste Weg, um einen Byte-Puffer zu nehmen und ihn für einen einfachen Zugriff auf die Nachrichteneigenschaften in die Nachricht zu werfen? Ich könnte mir eine Struktur vorstellen, aber ehrlich gesagt weiß ich es nicht genau.Struct für binäre Nachricht Serialisierung/Deserialisierung

EDIT:

Der Grund, warum ich will es nicht binär ist so, dass ich easliy die Daten in meiner Anwendung verwenden kann. Zum Beispiel möchte ich die binären Bits, die einen Befehlstyp darstellen, in eine Enum konvertieren. Wie diese (nur eine Darstellung dessen, was Ich mag würde tun):

struct CommandMessage 
{ 
    public CommandType Command { get; set; } 
    public object Data { get; set; } 
} 

enum CommandType 
{ 
    UserJoined, 
    MessageReceived 
} 
+1

Dies ist sehr unklar. Kannst du ein Beispiel von dem, was du versuchst, veröffentlichen? Warum brauchst du diese binäre Nachricht? Was machst du damit? Warum möchten Sie eine C# -Darstellung, die kein 'byte []' ist? – Oded

+0

Um dies zu beantworten, müssten wir genau verstehen, wie die Nachricht im Byte [] angeordnet ist - d. H. * Kann * logisch als Struktur entpackt werden (was ich ehrlich gesagt nicht wirklich empfehlen kann). Insbesondere wird jeder String-Inhalt "Nein" bedeuten. Sie müssen auch die Endianz von Daten usw. verstehen. Außerdem: im Binärformat gibt es nichts Magisches an 'BB' /' B8' - was beabsichtigen Sie zu tun, wenn ein 'BB' oder' B8' natürlich in einem Float passiert/int/Zeichenfolge/GUID/etc? –

+0

aktualisiert mit Beispiel – LordZardeck

Antwort

1

würde ich vorschlagen, protobuf-net für DTO Serialisierung zu verwenden.

So etwas wie Einheit definieren Package (CommandMessage in Ihrer Probe), die

public Command Command; 

public byte[] Data; hat (serialisiert mit protobuf)

Basierend auf Command können Sie Data deserialisieren DTO Typ auf Beton mit protobuf. Wenn Ihre Nachricht mit einem speziellen Präfix beginnen soll, können Sie dies auch in Package behandeln Auch Package sollte lesen/schreiben von/zu binären Stream oder Puffer (das ist ziemlich direkt).

z.B. package.WriteTo(buffer) produziert [BB,Command,Data,B8]. Das Gleiche gilt für package.ReadFrom()

+0

Siehe die Kommentare - das Format ist bereits vordefiniert –

+0

@MarcGravell Soweit ich aus Kommentaren verstand, sollte es funktionieren. Lassen Sie mich erklären: DTOs sind mit Protobuf serialisiert, aber Package (Wrapper um DTO + Command) behandelt alle Lese-/Schreiblogik. Sagen wir, wir haben package.WriteTo (...) was [BB, Command, Data (serialisiertes DTO), B8] schreibt. Gleicher Ansatz zum Lesen. –

+0

bis Sie ein natürlich vorkommendes B8 in der Nutzlast bekommen –

Verwandte Themen