我在C中用这样的结构写了
struct IMAGE {
unsigned int x, y;
unsigned char **data;
};
有人可以告诉我如何编组这个结构以在C#中使用吗?
我的解决方案不起作用。
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public class IMAGE
{
public UInt32 x;
public UInt32 y;
public byte[][] data;
};
答案 0 :(得分:1)
托管数组与指针不同。托管数组需要数组的大小,如果您正在尝试编组结构,则需要一个固定的大小来直接编组。
您可以使用MarshalAs
attribute的SizeConst
参数设置封送后的数据大小。
但我猜测x
和y
是图片的维度,data
的大小取决于这些变量。这里最好的解决方案是将其整理为IntPtr
,并在需要时访问数据:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public class IMAGE
{
public UInt32 x;
public UInt32 y;
private IntPtr data;
public byte[][] Data
{
get
{
byte[][] newData = new byte[y][];
for(int i = 0; i < y; i++)
{
newData[i] = new byte[x];
Marshal.Copy(new IntPtr(data.ToInt64() + (i * x)), newData[i], 0, x);
}
return newData;
}
set
{
for (int i = 0; i < value.Length; i++)
{
Marshal.Copy(value[i], 0, new IntPtr(data.ToInt64() + (i * x)), value[i].Length);
}
}
}
}
如果您被允许使用不安全的代码,则可以将IntPtr
更改为byte**
并直接使用它。
使用setter,您可能希望在盲目写入非托管内存之前验证值的大小。
答案 1 :(得分:-1)
我的猜测是:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public class IMAGE
{
public UInt32 x;
public UInt32 y;
public ref IntPtr data;
};
非常方便的参考是p / invoke cheatsheet。