La meilleure façon de représenter des tableaux de bits en C #?
-
28-09-2019 - |
Question
Je suis en train de construire une classe DHCPMessage en C #.
RFC est disponible ici: 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 l'on imagine que chaque champ est un tableau de bits de longueur fixe, ce qui est:
- Le plus versitile
- Les meilleures pratiques
façon de représenter cela comme une classe ???
OU .. comment voulez-vous écrire cela? :)
La solution
Vous êtes sur la mauvaise voie avec cela, il est un vecteur de bits. Le message est défini dans les « octets », mieux connu sous le nom « octets ». Une déclaration équivalente C # que vous pouvez utiliser avec Marshal.PtrToStructure est:
[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;
}
Vous devrez gérer les options de longueur variable champ séparément.
Autres conseils
Pour commencer, vous pouvez essayer BitArray classe. Pas besoin de réinventer la roue.
Si vous êtes inquiet à ce sujet de prendre trop de place / mémoire, ne soyez pas. Il suffit de l'initialiser à la bonne taille:
BitArray op = new BitArray(8);
(ci-dessus contiendra 8 bits et devrait prendre jusqu'à 1 octet)
Êtes-vous sûr que vous voulez être en utilisant des tableaux de bits pour certains d'entre eux? Par exemple, vous pouvez utiliser octet pour 8 bits, int pour 32 bits, et des tableaux d'octets pour les pièces que la carte null fin des chaînes comme « sname » par exemple. Ensuite, vous pouvez utiliser de simples opérateurs binaires (&, |). pour vérifier / manipuler les bits
Voici quelques messages que j'ai fait sur la conversion en-tête TCP à une structure, qui couvre également boutisme etc.
http://taylorza.blogspot.com /2010/04/archive-structure-from-binary-data.html http://taylorza.blogspot.com/2010/ 04 / archive binaire des données de-structure.html
Ce sont assez vieux, je les ai transférée de mon ancien blog juste pour qu'ils ne se perdent pas.