2013-04-06 11 views
5

Jestem nowy dla binarnego w C# i mam pytanie na najlepszy sposób, aby to zrobić. Mam aplikację, którą próbuję się komunikować, która ma określony format wiadomości binarnych. Musi rozpocząć się od kodu szesnastkowego B8, a kończy się kodem heksadecymalnym BB, z komunikatem binarnym pomiędzy. Jaki jest najlepszy sposób na pobranie bufora bajtów i przesłanie go do wiadomości, aby uzyskać łatwy dostęp do właściwości wiadomości? Wyobrażam sobie strukturę, ale szczerze mówiąc nie wiem.Struct dla serializacji/deserializacji wiadomości binarnych

EDIT:

Powodem nie chcę go w formacie binarnym jest tak, że mogę easliy korzystać z danych w mojej aplikacji. Na przykład chciałbym przekonwertować binarne bity, które reprezentują typ polecenia, na wyliczenie. (Tak jak to przedstawia to, co chciałbym zrobić):

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

enum CommandType 
{ 
    UserJoined, 
    MessageReceived 
} 
+1

To jest bardzo niejasne. Czy możesz podać przykład tego, co próbujesz zrobić? Dlaczego potrzebujesz tej binarnej wiadomości? Co ty z tym robisz? Dlaczego chcesz reprezentacji C#, która nie jest "bajtem []"? – Oded

+0

Aby odpowiedzieć na to pytanie, powinniśmy dokładnie zrozumieć, w jaki sposób wiadomość jest umieszczona w bajcie [] - tj. * Może * być logicznie rozpakowana jako struktura (co szczerze mówiąc, tak naprawdę nie polecam). W szczególności każda treść "ciąg" ma oznaczać "nie". Musisz również zrozumieć endianię jakichkolwiek danych, itd. Również: w binarnym nie ma nic magicznego na temat 'BB' /' B8' - co masz zamiar zrobić, jeśli 'BB' lub' B8' dzieje się naturalnie w float/int/string/guid/etc? –

+0

zaktualizowano na przykład – LordZardeck

Odpowiedz

1

Proponuję użyć protobuf-net dla DTO serializacji.

więc zdefiniować pewne jednostki np Package (CommandMessage w swojej próbie), który ma

public Command Command; 

public byte[] Data; (szeregowane z protobuf)

podstawie Command będzie można deserializować Data na beton DTO typ przy użyciu protobuf.

Jeśli twoja wiadomość powinna się zaczynać od specjalnego prefiksu, możesz obsłużyć to również w Package. Również, Package powinien obsługiwać sam zapis/czytanie do/z strumienia binarnego lub buforów (to całkiem sprytny krok naprzód).

np. package.WriteTo(buffer) produkuje [BB,Command,Data,B8]. To samo dla package.ReadFrom()

+0

Zobacz komentarze - format jest już wstępnie zdefiniowany –

+0

@MarcGravell o ile zrozumiałem z komentarzy, powinien działać. Pozwól mi wyjaśnić: DTO są serializowane z protobufem, ale Package (otacza DTO + Command) obsługuje całą logikę odczytu/zapisu. Powiedzmy, że mamy package.WriteTo (...), który pisze [BB, Command, Data (serializowany DTO), B8]. Takie samo podejście do czytania. –

+0

, dopóki nie pojawi się naturalnie występujący B8 w ładowności –

Powiązane problemy