Il modo migliore per rappresentare le matrici di bit in C #?
-
28-09-2019 - |
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 è:
- Il più versatile
- Le migliori pratiche
modo di rappresentare questo come classe ???
O .. come è possibile scrivere questo? :)
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.