C# 中来自 C++ 的无符号字符数组

unsigned char array from c++ in c#

本文关键字:无符号 字符 数组 C++      更新时间:2023-10-16

我正在尝试在 C# 中调用 C++ dll 函数。该函数有一个结构作为参数,我对变量 aby_data[8] 有问题。我将无符号 char[] 定义为字节 [],程序不会崩溃,但我没有收到任何数据。

结构C++

typedef struct st_canmsg
{
    long l_id;
    unsigned char by_len;
    unsigned char by_msg_lost;
    unsigned char by_extended;
    unsigned char by_remote;
    unsigned char aby_data[8];
    unsigned long ul_tstamp;
} CMSG;

转换为 C#

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct CMSG
{
    public Int32 l_id;
    public byte by_len;
    public byte by_msg_lost;
    public byte by_extended;
    public byte by_remote;
    public byte aby_data[];
    public UInt32 ul_tstamp;
};
CMSG t_CANMsg[] = new CMSG[1];
t_CANMsg[0].aby_data = new byte[8];
t_CANMsg[0].aby_data[0] = 01;
t_CANMsg[0].aby_data[1] = 02;
t_CANMsg[0].aby_data[2] = 03;
t_CANMsg[0].aby_data[3] = 04;
t_CANMsg[0].aby_data[4] = 05;
t_CANMsg[0].aby_data[5] = 06;
t_CANMsg[0].aby_data[6] = 07;
t_CANMsg[0].aby_data[7] = 08;
l_retval = canSend(handle, out t_CANMsg[0], out len);

您正在封送固定长度的数组,但未在结构定义中指定数组的大小。

您可以尝试像这样更新结构定义吗:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct CMSG
{
    public Int32 l_id;
    public byte by_len;
    public byte by_msg_lost;
    public byte by_extended;
    public byte by_remote;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
    public byte aby_data[];
    public UInt32 ul_tstamp;
};

或者,您也可以尝试显式定义字节:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct CMSG
{
    public Int32 l_id;
    public byte by_len;
    public byte by_msg_lost;
    public byte by_extended;
    public byte by_remote;
    public byte aby_data_0;
    public byte aby_data_1;
    public byte aby_data_2;
    public byte aby_data_3;
    public byte aby_data_4;
    public byte aby_data_5;
    public byte aby_data_6;
    public byte aby_data_7;
    public UInt32 ul_tstamp;
};

如果您仍然遇到问题,您还可以分享 canSend

基于Frederik Carlier代码,我得到了这个解决方案,将其用作数组:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct CMSG
{
    public Int32 l_id;
    public byte by_len;
    public byte by_msg_lost;
    public byte by_extended;
    public byte by_remote;
    public byte aby_data_0;
    public byte aby_data_1;
    public byte aby_data_2;
    public byte aby_data_3;
    public byte aby_data_4;
    public byte aby_data_5;
    public byte aby_data_6;
    public byte aby_data_7;
    public UInt32 ul_tstamp;
    public byte[] aby_data(){
        byte[] aby_data_array = new byte[8];
        aby_data_array[0] = aby_data_0;
        aby_data_array[1] = aby_data_1;
        aby_data_array[2] = aby_data_2;
        aby_data_array[3] = aby_data_3;
        aby_data_array[4] = aby_data_4;
        aby_data_array[5] = aby_data_5;
        aby_data_array[6] = aby_data_6;
        aby_data_array[7] = aby_data_7;
        return aby_data_array;
    }
};

l_retval = canRead(handle, out t_CANMsg[0], out len);
byte data [] = t_CANMsg[0].aby_data();