我有從服務器的源代碼下面的C結構,和許多類似:什麼是最簡單的字節級操作?
// preprocessing magic: 1-byte alignment
typedef struct AUTH_LOGON_CHALLENGE_C
{
// 4 byte header
uint8 cmd;
uint8 error;
uint16 size;
// 30 bytes
uint8 gamename[4];
uint8 version1;
uint8 version2;
uint8 version3;
uint16 build;
uint8 platform[4];
uint8 os[4];
uint8 country[4];
uint32 timezone_bias;
uint32 ip;
uint8 I_len;
// I_len bytes
uint8 I[1];
} sAuthLogonChallenge_C;
// usage (the actual code that will read my packets):
sAuthLogonChallenge_C *ch = (sAuthLogonChallenge_C*)&buf[0]; // where buf is a raw byte array
這些都是TCP數據包,我需要實現的東西,發射和在C#中讀取它們。最乾淨的方法是什麼?
我目前的做法涉及
[StructLayout(LayoutKind.Sequential, Pack = 1)]
unsafe struct foo { ... }
和大量的fixed
語句來讀取和寫入,但它感覺很笨重,而且由於數據包本身是不固定的長度,我不使用手感舒適它。此外,這是很多工作。
但是,它確實很好地描述了數據結構,並且協議可能會隨時間而改變,因此這可能是維護的理想選擇。
我有什麼選擇?只用C++編寫它並使用一些.NET魔術來使用它會更容易嗎?
說明:我還需要處理endian問題和空填充字符串。