Pergunta

Atualmente, estou construindo uma aula de DHCPMessage em C#.

RFC está disponível aqui: 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 imaginarmos que cada campo é uma matriz de bits de comprimento fixo, o que é:

  1. O mais versátil
  2. Melhor prática

maneira de representar isso como uma classe ???

Ou .. Como você escreveria isso? :)

Foi útil?

Solução

Você está na faixa errada com isso, não é um vetor um pouco. A mensagem é definida em "octetos", mais conhecida como "bytes". Uma declaração C# equivalente que você pode usar com o 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;
    }

Você precisará lidar com o campo Opções de comprimento variável separadamente.

Outras dicas

Para iniciantes, você pode tentar o BitArray classe. Não há necessidade de reinventar a roda aqui.

Se você está preocupado com isso ocupando muito espaço/memória, não seja. Basta inicializá -lo no tamanho certo:

BitArray op = new BitArray(8);

(O exposto acima manterá 8 bits e deve ocupar 1 byte)

Tem certeza de que deseja usar matrizes de bits para algumas delas? Por exemplo, você pode usar byte para 8 bits, int para 32 bits e matrizes de bytes para peças que mapa para strings terminados nulos como 'sname', por exemplo. Em seguida, você pode usar operadores simples bits (&, |) para verificar/manipular os bits.

Aqui estão algumas postagens que fiz na conversão do cabeçalho do TCP em uma estrutura, que também abrange Endianness etc.

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

Estes são bastante antigos, eu os migrei do meu blog antigo, apenas para que eles não se perca.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top