将IntPtr转换为byte [] c#

时间:2011-11-23 10:00:36

标签: c# .net marshalling

我从C ++库方法收到IntPtr值,我需要从收到的byte[]获取IntPtr数组。当我尝试这样做时:

byte[] myArray = new byte[Marshal.SizeOf(myReceivedIntPtr)];
Marshal.Copy(myReceivedIntPtr, myArray, 0, Marshal.SizeOf(myReceivedIntPtr));

我收到一个例外:AccessViolationException。 我错过了什么?

修改

这是C ++库标题中的方法名称和参数:

int MSR_DecodeTrack(char *AscBuff, unsigned char *BinBuff, unsigned char bpc, unsigned char parity, unsigned char ss, unsigned char es);

我用C#这样称呼它:

 UInt32 result;
 IntPtr myReceivedIntPtr;
 IntPtr BinBuff;
 byte BPC1 = 7, Parity1 = 1, SS1 = 0x05, ES1 = 0x1F;

 result = MSR_DecodeTrack(ref myReceivedIntPtr, ref BinBuff, BPC1, Parity1, SS1, ES1);

这是其他代码:

 byte[] myArray = new byte[Marshal.SizeOf(myReceivedIntPtr)];
 Marshal.Copy(myReceivedIntPtr, myArray, 0, Marshal.SizeOf(myReceivedIntPtr));

2 个答案:

答案 0 :(得分:2)

我很确定Marshal.SizeOf(myReceivedIntPtr)将返回IntPtr对象的大小,而不是非托管数组的大小。您需要从c ++库中获取非托管数组的大小。

我有一段时间不必这样做,所以我有点生疏,但从查看c ++标题我认为它期待一个指向缓冲区的指针。你给它一个指向指针的指针(intptr是一个指针并通过ref传递它意味着你传递c ++代码指向该指针的指针)。首先,不要使用ref。其次,我怀疑你应该传递一个已经很大的缓冲区 - 是否有任何文档描述你应该传递给函数的内容?函数的返回码是什么?你正在检查它是否成功不是吗? ;)

答案 1 :(得分:0)

名为MSR_DecodeTrack的方法也应该返回它分配的每个数组的长度。

据我所知,当你在C / C ++环境中分配一个数组时,你得到一个指向该数组的零元素的指针,仅此而已。因此,您还应该以某种方式将已分配数组的长度返回给调用者。它可以通过额外的" ref"参数。

HTH。