Je passe des paquets de données de 64 octets par USB à un microcontrôleur. Dans le code microcontrôleur C les paquets ont la structure,Comment convertir un tableau d'octets C# en données structurées?
typedef union
{
unsigned char data[CMD_SIZE];
cmd_get_t get;
// plus more union options
} cmd_t;
avec
typedef struct
{
unsigned char cmd; //!< Command ID
unsigned char id; //!< Packet ID
unsigned char get_id; //!< Get identifier
unsigned char rfu[3]; //!< Reserved for future use
union
{
unsigned char data[58]; //!< Generic data
cmd_get_adc_t adc; //!< ADC data
// plus more union options
} data; //!< Response data
} cmd_get_t;
et
typedef struct
{
int16_t supply;
int16_t current[4];
} cmd_get_adc_t;
Du côté PC en C# Je suis muni d'une fonction qui renvoie le Un paquet de 64 octets est un octet []. La fonction utilise Marshal.Copy pour copier les données reçues dans le tableau Byte []. J'ai ensuite utilisé une struct C# de la forme
[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct COMMAND_GET_ADC
{
public byte CommandID;
public byte PacketID;
public byte GetID;
[MarshalAs(UnmanagedType.ByValArray, SizeConst=3)]
public byte[] RFU;
public short Supply;
[MarshalAs(UnmanagedType.ByValArray, SizeConst=4)]
public short[] Current;
}
et Marshal.Copy utilisé à nouveau pour copier le tableau d'octets dans la structure afin que je puisse travailler avec des données structurées est comme, par exemple
COMMAND_GET_ADC cmd = (COMMAND_GET_ADC)RawDeserialize(INBuffer, 1, typeof(COMMAND_GET_ADC));
short supply = cmd.Supply;
avec
public static object RawDeserialize(Byte[] rawData, int position, Type anyType)
{
int rawsize = Marshal.SizeOf(anyType);
if(rawsize > rawData.Length)
{
return null;
}
IntPtr buffer = Marshal.AllocHGlobal(rawsize);
Marshal.Copy(rawData, position, buffer, rawsize);
object retobj = Marshal.PtrToStructure(buffer, anyType);
Marshal.FreeHGlobal(buffer);
return retobj;
}
Cela se sent comme je fais beaucoup de copies des données et comme il pourrait ne pas être la manière la plus productive de réaliser ce que je veux. J'ai également besoin de convertir les données structurées en un tableau d'octets pour les commandes à l'appareil. J'ai une méthode qui utilise le même processus (c'est-à-dire utilise une structure puis le sérialise dans un tableau d'octets et passe le tableau d'octets à la fonction d'écriture).
Y a-t-il de meilleures alternatives?
Dans la base de code, je travaille de la classe est déclarée dangereuse (pour permettre interaction avec les dll Win32 USB HID). Donc oui, je suppose que je pourrais. J'ai juste besoin de comprendre quelles sont les implications et les dangers de dangereux. Je l'évitais parce que je ne comprends pas encore tout à fait. –