asp.net中c# byte[] 转换为 IntPtr几种方法
2024-07-23 10:14:04 217人阅读
有几种方法可以访问与字节数组相对应的 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.htmasp.net中c# byte[] 转换为 IntPtr几种方法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉:
投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。