我有一个供应商提供给我们的库的头文件中定义的以下结构。
typedef struct {
int iLen;
int iType;
int state;
unsigned char data[1200];
} TCardCmdRespond;
我在C#中创建了一个我认为匹配的结构。
[StructLayout(LayoutKind.Sequential)]
public struct TCardCmdRespond
{
public int iLen;
public int iType;
public int state;
public byte[] data;
}
我在这里要指出一些事情。我不确定unsigned char数组应该映射到什么。我最初猜测unsigned char应映射到char,但C#中的char是Unicode,所以看起来它不会起作用。我也尝试将它映射到一个字节。我也不知道长度1200对于编组人员是否有意义,如果是,那么如何指定它。
我的monotouch应用程序中有以下方法,它将结构作为参数。
[Export("OnRecvData:")]
public void OnRecvData(TCardCmdRespond respond)
{
...
}
该方法由库通过选择器调用。调用该方法没有问题。当我查看结构中包含的数据时会出现问题。当我期望它们在1-3之间时,这些数字非常高(类似的Objective-c代码显示iType在这个范围内)。我尝试使用位转换器来反转字节顺序,以防它是编组器没有为我解决的字节序问题。数字仍然很高所以我认为问题不仅仅是简单的字节顺序。
当我尝试从char数组中提取数据时,会出现更多问题。它不是null但是尝试以空检查之外的任何方式访问它会使应用程序崩溃EXC_BAD_ACCESS(SIGABRT)
我的解决方法是在objective-c中为此编写一个包装器,将结构分解为参数。然后创建一个包装它的库并将其绑定。我的客观技能不是很热,但这是一个缓慢的过程。
有没有办法让我可以完成这项工作,而无需将其包装在Objective-c库中?
答案 0 :(得分:2)
您的C#定义不正确。
C版本包含一个1200字节的内联块,而C#版本包含一个指向数组的指针(4个字节)。
你可以看一下: