Je ne sais pas exactement ce que vous demandez. Êtes-vous en train d'essayer d'obtenir une définition de structure équivalente en C# pour une utilisation simple en C# ou à des fins d'interop (PInvoke)? Si c'est pour PInvoke la structure follownig travaillera
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct tPacket {
/// WORD->unsigned short
public ushort word1;
/// WORD->unsigned short
public ushort word2;
/// BYTE->unsigned char
public byte byte1;
/// BYTE->unsigned char
public byte byte2;
/// BYTE[8]
[System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst=8, ArraySubType=System.Runtime.InteropServices.UnmanagedType.I1)]
public byte[] array123;
}
Si vous êtes à la recherche d'une structure ancienne plaine C# qui a les mêmes caractéristiques, il est malheureusement pas possible de faire avec un struct. Vous ne pouvez pas définir un tableau en ligne d'une taille constante dans une structure C#, ni forcer le tableau à avoir une taille spécifique via un initialiseur.
Il existe deux options alternatives dans le monde géré.
Utilisez une struct qui a une méthode de création qui remplit le tableau
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct tPacket {
public ushort word1;
public ushort word2;
public byte byte1;
public byte byte2;
public byte[] array123;
public static tPacket Create() {
return new tPacket() { array123 = new byte[8] };
}
}
Ou bien utiliser une classe où vous pouvez initialiser directement la variable membre de array123.
EDIT OP watns pour savoir comment convertir un octet [] en une valeur de tPacket
Malheureusement, il n'y a pas de bonne façon de le faire en C#. C++ était génial pour ce genre de tâche car il a un système de type très faible en ce sens que vous pouvez choisir d'afficher un flux d'octets en tant que structure particulière (un mauvais pointeur).
Cela peut être possible dans un code C# dangereux, mais je ne le crois pas. Essentiellement, ce que vous aurez à faire est d'analyser manuellement les octets et de les affecter aux différentes valeurs dans la structure. Ou écrivez une méthode native qui fait le casting de style C et PInvoke dans cette fonction.
En outre, vous ne devez pas mettre ce code dans un bloc dangereux. – scottm
scotty2012, Merci. J'ai quelques problèmes dans l'ordre des octets, mais je vais essayer de comprendre par moi-même. Si ce n'est pas le cas, postez une autre question. Merci les deux! –
Parfois, vous devez jouer avec le paramètre Pack dans les attributs de structure. Je pense que par défaut C# est de 8 octets, mais c est 4, ou quelque chose à cet effet. Je ne me souviens pas du haut de ma tête. – scottm