Estoy pasando paquetes de datos de 64 bytes a través de USB a un microcontrolador. En el código de microcontrolador C que los paquetes tienen la estructura,¿Cómo convierto una matriz de bytes C# en datos estructurados?
typedef union
{
unsigned char data[CMD_SIZE];
cmd_get_t get;
// plus more union options
} cmd_t;
con
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;
y
typedef struct
{
int16_t supply;
int16_t current[4];
} cmd_get_adc_t;
En el lado de la PC en C# me ha proporcionado con una función que devuelve el Paquete de 64 bytes como un byte []. La función utiliza Marshal.Copy para copiar los datos recibidos en la matriz Byte []. Luego utiliza un C# struct de la forma
[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;
}
y otra vez utilizado Marshal.Copy para copiar la matriz de bytes en el struct de modo que pudiera trabajar es como datos estructurados, por ejemplo
COMMAND_GET_ADC cmd = (COMMAND_GET_ADC)RawDeserialize(INBuffer, 1, typeof(COMMAND_GET_ADC));
short supply = cmd.Supply;
con
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;
}
Esto sólo se siente como que estoy haciendo un montón de copias de los datos y, como tal vez no sea la manera más productiva de lograr lo que quiero. También necesito convertir los datos estructurados a una matriz de bytes para los comandos en el dispositivo. Tengo un método que usa el mismo proceso (es decir, usa una estructura y luego la serializa en una matriz de bytes y pasa la matriz de bytes a la función de escritura).
¿Hay mejores alternativas?
En la base de código que estoy trabajando desde la clase se declara insegura (para permitir interacción con el dll de USB de Win32 USB). Entonces sí, supongo que podría. Solo necesito descubrir cuáles son las implicaciones y peligros de inseguridad. Lo estaba evitando porque aún no lo entiendo del todo. –