2011-11-23 276 views
1

我收到IntPtr价值从C++库的方法,我需要从byte[]阵列从这个收到IntPtr。当我尝试这样做:IntPtr转换为字节[] c#

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

我收到异常:AccessViolationException。 我错过了什么?

编辑

这里是方法名和C++库的头PARAMS:

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)); 
+1

谷歌帮助没有其他答案吗? http://www.google.co.uk/search?q=Marshal.Copy+AccessViolationException –

+2

Tk1AscBuff的类型是什么? ... Marshal.SizeOf(myReceivedIntPtr)将返回一个IntPtr的大小,通常是4/8字节......你是否计划将一个指针从非托管内存复制到托管数组中? – DarkSquirrel42

+0

Tk1AscBuff被重命名为myReceivedIntPtr,我已经完成了它。那么如何使用IntPtr获取字节数组的大小呢? –

回答

2

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

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

+0

您能告诉我如何执行此操作吗? –

+0

首先包含您要调用的代码以将intptr传递给非托管数组,并且我可能会提供帮助。我不认为C++数组有限制信息,所以你需要自己跟踪数组的大小。您调用获取指针的方法可能还会返回大小 –

+0

完成,请检查 –

0

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

就我所知,当你在C/C++环境中分配一个数组时,你会得到一个指向该数组的零元素的指针,仅此而已。出于这个原因,你也应该以某种方式将分配数组的长度返回给调用者。它可以通过额外的“ref”参数完成。

HTH。