static void Main(string[] args) { byte[] a = new byte[]{0,0,0,0}; byte[] b = new byte[] {1,2,3,4}; IntPtr pt = Marshal.AllocHGlobal(a.Length); //从source数组的startIndex下标开始复制length个对象到ptr; Marshal.Copy(b,0,pt+0,b.Length); //从ptr复制length个对象到目标数组的,从目标数组的startIndex开始写入。 Marshal.Copy((pt+1),a,1,2); unsafe { byte* pb = (byte*) pt; for (int i = 0; i < a.Length; i++) { Console.WriteLine("/b:"+(*pb++) + "/a:" + a[i]); } } //释放非托管内存; Marshal.FreeHGlobal(pt); byte[] arBt = new byte[]{200,0,20,30,40,50,60,70,80,90,11,12,13,14,0x0f,199}; IntPtr ptr = Marshal.AllocHGlobal(arBt.Length); //写入数据; Marshal.Copy(arBt, 0, ptr, arBt.Length); short[] arSt = new short[arBt.Length / sizeof(short)]; int[] arInt = new int[arBt.Length / sizeof(int)]; //复制为short数据; Marshal.Copy(ptr, arSt, 0, arSt.Length); //调整数据 此时arSt不变 下面的arInt改变;
C#指针操作Marshal实例
最新推荐文章于 2024-09-25 17:01:32 发布
本文介绍了C#中如何利用指针进行内存操作,特别是结合Marshal类,可以方便地获取非托管内存的IntPtr指针,并将其转换为不同类型指针,进行数据的Copy、Read和Write等操作。
摘要由CSDN通过智能技术生成