Domanda

Al momento sto costruendo una classe DHCPMessage in C #.

RFC è disponibile qui: 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;
}

Se immaginiamo che ogni campo è una matrice di bit di lunghezza fissa, ciò che è:

  1. Il più versatile
  2. Le migliori pratiche

modo di rappresentare questo come classe ???

O .. come è possibile scrivere questo? :)

È stato utile?

Soluzione

Siete sulla pista di sbagliato in questo, non è un vettore di bit. Il messaggio viene definito in "ottetti", meglio conosciuta come "byte". Un equivalente dichiarazione di C # che è possibile utilizzare con Marshal.PtrToStructure è:

    [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;
    }

Avrete bisogno di gestire il campo opzioni di lunghezza variabile a parte.

Altri suggerimenti

Per cominciare, si potrebbe provare la BitArray classe. Non c'è bisogno di reinventare la ruota qui.

Se siete preoccupati che prendendo troppo spazio / di memoria, non essere. Da inizializzare alla giusta dimensione:

BitArray op = new BitArray(8);

(Quanto sopra contenere 8 bit e dovrebbe prendere 1 byte)

Sei sicuro che si desidera essere l'utilizzo di matrici di bit per alcuni di questi? Ad esempio, è possibile utilizzare byte per 8 bit, int per 32 bit, e campi di byte per pezzi che mappa per terminazione null stringhe come 'sname' per esempio. Quindi è possibile utilizzare gli operatori bit a bit semplici (&, |). Controllare / manipolare i bit

Ecco alcuni post che ho fatto sulla conversione TCP ad una struttura, che copre anche endianness etc.

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

Questi sono abbastanza vecchi, li ho migrato dal mio vecchio blog solo in modo che non vadano perse.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top