2013-04-06 8 views
5

Sono nuovo al binario in C# e ho una domanda sul modo migliore per farlo. Ho un'applicazione che sto cercando di comunicare con uno specifico formato di messaggio binario. Deve iniziare con un codice esadecimale B8 e terminare con un codice esadecimale BB, con il messaggio binario in mezzo. Qual è il modo migliore di essere in grado di prendere un buffer di byte e trasmetterlo al messaggio per un facile accesso alle proprietà del messaggio? Immagino una struttura, ma in tutta onestà non lo so davvero.Struct for serialinary message/deserialization

EDIT:

Il motivo per cui non lo voglio in binario è così che posso usare easliy i dati nella mia applicazione. Ad esempio, mi piacerebbe convertire i bit binari che rappresentano un tipo di comando in un enum. Ti piace questa (solo una rappresentazione di quello che mi piacerebbe fare):

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

enum CommandType 
{ 
    UserJoined, 
    MessageReceived 
} 
+1

Questo è molto poco chiaro. Puoi pubblicare un esempio di ciò che stai cercando di fare? Perché hai bisogno di questo messaggio binario? Cosa fai con esso? Perché vuoi una rappresentazione in C# che non sia un 'byte []'? – Oded

+0

Per rispondere, dovremmo capire esattamente come il messaggio è disposto nel byte [] - cioè * può * essere logicamente decompresso come una struct (che sinceramente non lo raccomando comunque). In particolare, qualsiasi contenuto 'stringa' significherà" no ". Devi anche capire la endianità di qualsiasi dato, ecc. Inoltre: in binario non c'è nulla di magico in 'BB' /' B8' - cosa intendi fare se un 'BB' o' B8' accade naturalmente all'interno di un float/int/string/guid/etc? –

+0

aggiornato con l'esempio – LordZardeck

risposta

1

Vorrei suggerire di utilizzare protobuf-net per DTO serializzazione.

Quindi, definire una qualche entità esempio Package (CommandMessage nel campione) che ha

public Command Command; 

public byte[] Data; (serializzato con protobuf)

Sulla base Command si sarà in grado di deserializzare Data al calcestruzzo DTO tipo utilizzando protobuf.

Se il messaggio deve iniziare con un prefisso speciale, è possibile gestirlo anche in Package. Inoltre, Package dovrebbe gestire la scrittura/lettura stessa da/verso stream o buffer binari (che è piuttosto stretto in avanti).

ad esempio package.WriteTo(buffer) produce [BB,Command,Data,B8]. Lo stesso per package.ReadFrom()

+0

Vedere i commenti - il formato è già predefinito –

+0

@MarcGravell per quanto ho capito dai commenti, dovrebbe funzionare. Lasciatemi spiegare: i DTO sono serializzati con protobuf, ma Package (wrapper around DTO + Command) gestisce tutta la logica di lettura/scrittura. Quindi diciamo che abbiamo package.WriteTo (...) che scrive [BB, Command, Data (DTO serializzato), B8]. Lo stesso approccio per la lettura. –

+0

finché non si ottiene un B8 naturale nel carico utile –