Pregunta

Actualmente estoy construyendo una clase DHCPMessage en C #.

RFC está disponible aquí: 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 imaginamos que cada campo es una matriz de bits de longitud fija, lo que es:

  1. El más versátil
  2. Las mejores prácticas

manera de representar esto como una clase ???

O .. ¿cómo escribir esto? :)

¿Fue útil?

Solución

Usted está en el camino equivocado con esto, no es un vector de bits. El mensaje se define en "octetos", mejor conocido como "bytes". Una declaración equivalente C # que se puede utilizar con Marshal.PtrToStructure es:

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

Usted tendrá que manejar el campo de opciones de longitud variable por separado.

Otros consejos

Para empezar, puede probar con el BitArray clase. No hay necesidad de reinventar la rueda.

Si usted está preocupado por ello ocupar demasiado espacio / memoria, no seas. Sólo inicializarlo con el tamaño correcto:

BitArray op = new BitArray(8);

(Lo anterior llevará a cabo de 8 bits y debe tomar hasta 1 byte)

¿Está seguro que desea ser la utilización de matrices de bits para algunos de estos? Por ejemplo, puede utilizar el byte de 8 bits, int de 32 bits, y las matrices de bytes para las piezas que se asignan a terminada en nulo cadenas como 'Sname' por ejemplo. A continuación, puede utilizar operadores de bits simples (y, |). Para comprobar / manipular los bits

Aquí hay algunos anuncios que hice sobre la conversión de cabecera TCP a una estructura, que también cubre endianness etc.

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

Estos son bastante viejo, les emigrado de mi antiguo blog sólo para que no se pierdan.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top