[英]Copying byte array with Marshal.Copy from IntPtr using C# doesn't work
[英]Marshal.Copy, copying an array of IntPtr into an IntPtr
我無法弄清楚Copy(IntPtr[], Int32, IntPtr, Int32)
方法是如何工作的。 我雖然它可以將多個IntPtrs中包含的數據復制到一個IntPtr(作為MSDN狀態),但顯然它不能像我預期的那樣工作:
IntPtr[] ptrArray = new IntPtr[]
{
Marshal.AllocHGlobal(1),
Marshal.AllocHGlobal(2)
};
Marshal.WriteByte(ptrArray[0], 0, 0xC1);
// Allocate the total size.
IntPtr ptr = Marshal.AllocHGlobal(3);
Marshal.Copy(ptrArray, 0, ptr, ptrArray.Length);
// I expect to read 0xC1 but Value is always random!!
byte value = Marshal.ReadByte(ptr, 0);
有人知道我是否正在使用這種方法而不是它的目的嗎?
static void Main(string[] args)
{
IntPtr[] ptrArray = new IntPtr[]
{
Marshal.AllocHGlobal(1),
Marshal.AllocHGlobal(2)
};
Marshal.WriteByte(ptrArray[0], 0, 100);
int size = Marshal.SizeOf(typeof(IntPtr)) * ptrArray.Length;
IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.Copy(ptrArray, 0, ptr, ptrArray.Length);
// Now we have native pointer ptr, which points to two pointers,
// each of thme points to its own memory (size 1 and 2).
// Let's read first IntPtr from ptr:
IntPtr p = Marshal.ReadIntPtr(ptr);
// Now let's read byte from p:
byte b = Marshal.ReadByte(p);
Console.WriteLine((int)b); // prints 100
// To do: release all IntPtr
}
閱讀評論中的解釋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.