码迷,mamicode.com
首页 > Web开发 > 详细

asp.net中c# byte[] 转换为 IntPtr几种方法

时间:2014-09-19 17:39:05      阅读:236      评论:0      收藏:0      [点我收藏+]

标签:style   http   color   io   使用   ar   数据   sp   代码   

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

第一种,使用不安全的代码块来访问直接指向字节数组的指针。

 代码如下 复制代码

unsafe
{
    byte[] test = new byte[5];
    fixed (byte* p = &test[0])
    {
        *p = 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);
}

原文来自:http://www.111cn.net/net/160/66646.htm

asp.net中c# byte[] 转换为 IntPtr几种方法

标签:style   http   color   io   使用   ar   数据   sp   代码   

原文地址:http://blog.csdn.net/mailangel123/article/details/39400703

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!