Question

Je suis en train de construire une classe DHCPMessage 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. Les meilleures pratiques

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

OU .. comment voulez-vous écrire cela? :)

Était-ce utile?

La solution

Vous êtes sur la mauvaise voie avec cela, il est un vecteur de bits. Le message est défini dans les « 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 devrez gérer les options de longueur variable champ séparément.

Autres conseils

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

Si vous êtes inquiet à ce sujet de prendre trop de place / mémoire, ne soyez pas. Il suffit de l'initialiser à la bonne taille:

BitArray op = new BitArray(8);

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

Êtes-vous sûr que vous voulez être en utilisant des tableaux de bits pour certains d'entre eux? Par exemple, vous pouvez utiliser octet pour 8 bits, int pour 32 bits, et des tableaux d'octets pour les pièces que la carte null fin des chaînes comme « sname » par exemple. Ensuite, vous pouvez utiliser de simples opérateurs binaires (&, |). 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 binaire des données de-structure.html

Ce sont assez vieux, je les ai transférée de mon ancien blog juste pour qu'ils ne se perdent pas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top