我正在通过USB将64字节数据包传递给微 Controller 。在微 Controller C代码中,数据包具有以下结构:

typedef union
{
    unsigned char data[CMD_SIZE];
    cmd_get_t get;
    // plus more union options
} cmd_t;


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;


typedef struct
{
    int16_t supply;
    int16_t current[4];
} cmd_get_adc_t;

在C#的PC端,我提供了一个函数,该函数将64字节的数据包作为Byte []返回。该函数使用Marshal.Copy将接收到的数据复制到Byte []数组中。然后,我使用了以下形式的C#结构
[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;
    }

然后再次使用Marshal.Copy将字节数组复制到结构中,这样我就可以将其作为结构化数据使用,例如
COMMAND_GET_ADC cmd = (COMMAND_GET_ADC)RawDeserialize(INBuffer, 1, typeof(COMMAND_GET_ADC));
short supply = cmd.Supply;


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;
}

感觉就像我正在复制大量数据,并且可能不是实现我想要的最有效的方式。我还需要将结构化数据转换回字节数组,以便发送给设备的命令。我有一个使用相同过程的方法(即使用结构,然后将其序列化为字节数组并将字节数组传递给写入函数)。

有更好的选择吗?

最佳答案

如果可以使用不安全的代码,则可以使用'fixed'关键字将字节数组转换为指向结构的指针。

关于c# - 如何将C#字节数组转换为结构化数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4274597/

10-11 15:13
查看更多