# C# 字节数组byte[] 和 非托管资源IntPtr 相互复制数据(备忘)

字节数组byte[]和非托管资源(IntPtr)之间相互复制数据

1、使用Span<byte>

可以装杯,就是不能在异步方法里用,因为需要unsafe

C#
//假设这里从非托管资源获得数据指针
IntPtr packet;
//你知道了数据长度
int packetSize = 2048;

//从指针复制到 字节数组
byte[] buffer = new byte[packetSize];
new Span<byte>((byte*)packet, (int)packetSize).CopyTo(buffer.AsSpan(0, (int)packetSize));

//从字节数组复制到指针
buffer.Span.CopyTo(new Span<byte>((byte*)packet, buffer.Length));

2、使用 Marshal.Copy

源码里也是用的Span<byte>,在异步方法里可以用这玩意儿

C#
//从指针复制到 字节数组
Marshal.Copy(packet,buffer,0,packetSize);
//从字节数组复制到指针
Marshal.Copy(buffer,0,packet,packetSize);