J'ai la struct C suivant du code source d'un serveur, et beaucoup similaires:Quelle est la manière la plus propre de faire des manipulations au niveau des octets?
// 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
Ce sont des paquets TCP, et je dois mettre en œuvre quelque chose qui émet et les lit en C#. Quelle est la manière la plus propre de faire ceci?
Mon approche actuelle implique
[StructLayout(LayoutKind.Sequential, Pack = 1)]
unsafe struct foo { ... }
et beaucoup de déclarations fixed
à lire et à écrire, mais il se sent vraiment maladroit, et puisque la longueur paquet lui-même est pas fixe, je ne me sens pas à l'aise avec il. Aussi, c'est beaucoup de travail. Cependant, il décrit bien la structure de données, et le protocole peut changer au fil du temps, ce qui peut être idéal pour la maintenance.
Quelles sont mes options? Serait-il plus facile de simplement l'écrire en C++ et d'utiliser un peu de magie .NET pour l'utiliser?
Clarification: J'ai aussi besoin de gérer les problèmes d'endian et les chaînes de caractères null-padded.