兔八哥极品软件园    运行: 2725天 | 文章:583 篇 | 评论:963 条 | 碎语:1条

c# byte[] 转换为 IntPtr?

作者:admin 发布于:2014-9-16 10:39 Tuesday 分类:.NET


有几种方法可以访问与字节数组相对应的 IntPtr

第一种,使用不安全的代码块来访问直接指向字节数组的指针。
复制代码
unsafe
{
    
byte[] test = new byte[5];
    
fixed (byte* p = &test[0])
    {
        
*= 0xff;
    }
}
复制代码

第二种,可以使用 GCHandle 来获得对象
复制代码

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 创建内存块并将数据封送处理到该内存块
复制代码

[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);
}
复制代码


Powered by 兔八哥极品软件 苏ICP备12049267号 sitemap