2010-04-19 14 views
1

Je suis en train de construire une classe DHCPMessage en C#.La meilleure façon de représenter les tableaux de bits en C#?

RFC est disponible ici: http://www.faqs.org/rfcs/rfc2131.html

Pseudo

public object DHCPMessage 
{ 
    bool[8] op; 
    bool[8] htype; 
    bool[8] hlen; 
    bool[8] hops; 
    bool[32] xid; 
    bool[16] secs; 
    bool[16] flags; 
    bool[32] ciaddr; 
    bool[32] yiaddr; 
    bool[32] siaddr; 
    bool[32] giaddr; 
    bool[128] chaddr; 
    bool[512] sname; 
    bool[1024] file; 
    bool[] options; 
} 

Si l'on imagine que chaque champ est un tableau de bits de longueur fixe, ce qui est:

  1. Le plus versitile
  2. Meilleure pratique

façon de représenter cela comme une classe ???

OU .. comment écrireiez-vous cela? :)

+0

Pensez à regarder la source C# de Bouncy Castle Crypto. Ils implémentent de nombreuses normes RFC traitant des concepts de niveau de bits. – AaronLS

+0

Par opposition à byte, int non signé, etc? – GalacticCowboy

Répondre

4

Vous êtes sur la mauvaise voie avec ceci, ce n'est pas un vecteur de bit. Le message est défini en "octets", mieux connu sous le nom "octets". Une déclaration équivalente C# que vous pouvez utiliser avec Marshal.PtrToStructure est:

[StructLayout(LayoutKind.Sequential, Pack=1, CharSet=CharSet.Ansi)] 
    struct DHCPMessage { 
     public byte op; 
     public byte htype; 
     public byte hlen; 
     public byte hops; 
     public uint xid; 
     public ushort secs; 
     public ushort flags; 
     public uint ciaddr; 
     public uint yiaddr; 
     public uint siaddr; 
     public uint giaddr; 
     [MarshalAs(UnmanagedType.ByValArray, SizeConst=16)] 
     public byte[] chaddr; 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst=64)] 
     public string sname; 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst=128)] 
     public string file; 
    } 

Vous aurez besoin de gérer les options de longueur variable champ séparément.

+0

C'est probablement la "bonne" réponse. Je n'avais aucune idée de la raison pour laquelle il voulait représenter ces champs comme des matrices mais supposait qu'il devait y avoir une bonne raison à cela. Si le message est réellement supposé être * envoyé * quelque part alors les tableaux de bit ne font que créer un travail inutile. – Aaronaught

11

Pour commencer, vous pouvez essayer la classe BitArray. Pas besoin de réinventer la roue ici.

Si cela vous inquiète de prendre trop de place/de mémoire, ne le faites pas. Il suffit de l'initialiser à la bonne taille:

BitArray op = new BitArray(8); 

(ci-dessus contiendra 8 bits et devrait prendre 1 octet)

+0

sûr que ce n'est pas un peu ballonnements? – divinci

+0

Non - sa partie du cadre, c'est déjà là –

2

Êtes-vous sûr que vous voulez être en utilisant des tableaux de bits pour certains d'entre eux? Par exemple, vous pouvez utiliser un octet pour 8 bits, un int pour 32 bits et un tableau d'octets pour les éléments mappés sur des chaînes terminées par un caractère nul comme 'sname' par exemple. Vous pouvez ensuite utiliser des opérateurs de bits simples (&, |) pour vérifier/manipuler les bits.

Voici quelques messages que j'ai fait sur la conversion en-tête TCP à une structure, qui couvre également boutisme etc.

http://taylorza.blogspot.com/2010/04/archive-structure-from-binary-data.html http://taylorza.blogspot.com/2010/04/archive-binary-data-from-structure.html

Ce sont assez vieux, je les ai migré de mon ancien blog juste pour ne te perds pas.

+0

Je suis d'accord - le faire comme dans le PO serait FIENDISHLY difficile puisque la signification est dans le domaine dans son ensemble, pas des bits individuels dans ce domaine. – GalacticCowboy