C# 中来自 C++ 的无符号字符数组
unsigned char array from c++ in c#
我正在尝试在 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();
相关文章:
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 如何在保持其值的同时将 c++ 无符号字符变量转换为 char 变量
- 从 std::vector<无符号字符>切片中提取 int?
- 将无符号字符的向量存储在数组中会给我 std::bad_alloc
- 使用 fopen 打开 .pak 文件并使该文件应用于 const 无符号字符* (C++)
- 库特无符号字符
- 寻找一种更好的方法来表示无符号字符数组
- C++ 无符号字符 *{varName};-> C#
- 如何返回/复制unique_ptr<无符号字符[]>的值?
- 将浮点数转换为无符号字符数组并打印出来
- 在函数中返回无符号字符数组,但不返回指针
- 如何在 C/C++ 中将无符号字符*转换为无符号字符数组?
- 如何返回实际值(在我的例子中是无符号字符数组)而不是来自 C++ 函数的指针?
- 如何将带有十六进制值的 std::string 转换为 std::vector<无符号字符>
- 无符号字符打印其 ASCII 值
- 字符数组到无符号字符 *
- 是否可以在 c++ 中将两位数保存在无符号字符中