Melhor maneira de representar matrizes de bits em C#?
-
28-09-2019 - |
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 é:
- O mais versátil
- Melhor prática
maneira de representar isso como uma classe ???
Ou .. Como você escreveria isso? :)
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.