【发布时间】:2010-06-02 11:55:54
【问题描述】:
我有以下来自服务器源代码的 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 魔法来使用它会更容易吗?
澄清:我还需要处理字节序问题和空填充字符串。
【问题讨论】:
标签: c# marshalling bytearray byte