C# byte[] 獲取數組的IntPtr


有幾種方法可以訪問與字節數組相對應的 IntPtr。

第一種是使用不安全的代碼塊來訪問直接指向字節數組的指針。

//C#

unsafe

{

byte[] test = new byte[5];

fixed (byte* p = &test[0])

{

*p = 0xff;

}

}

也可以使用 GCHandle 來獲得對象。

//C#

using System.Runtime.InteropServices;

byte[] test = new byte[5];

GCHandle hObject = GCHandle.Alloc(test, GCHandleType.Pinned);

IntPtr pObject = hObject.AddrOfPinnedObject();

if(hObject.IsAllocated)

hObject.Free();

最后,可以這樣實現:通過 LocalAlloc 創建內存塊並將數據封送處理到該內存塊。

//C#

[DllImport("coredll.dll",SetLastError=true)]

public static extern IntPtr LocalAlloc(uint uFlags, uint uBytes);

[DllImport("coredll.dll",SetLastError=true)]

public static extern IntPtr LocalFree(IntPtr hMem);

[DllImport("coredll.dll",SetLastError=true)]

public static extern IntPtr LocalReAlloc(IntPtr hMem, uint uBytes, uint fuFlags);

public const uint LMEM_FIXED = 0;

public const uint LMEM_MOVEABLE = 2;

public const uint LMEM_ZEROINIT = 0x0040;

byte[] test = new byte[5];

IntPtr p = LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT, (uint)test.Length);

if (p == IntPtr.Zero)

{

throw new OutOfMemoryException();

}

else

{

Marshal.Copy(test, 0, p, test.Length);

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM