C# 如何从 IntPtr 获取 Byte[]

作者:编程家 分类: arrays 时间:2025-12-04

使用C#从IntPtr获取Byte数组的方法

在C#中,我们经常会遇到需要从非托管代码获取数据的情况,其中IntPtr类型通常用于表示指向内存中某个位置的指针。如果我们想将这个指针指向的数据转换为Byte数组,我们可以使用一些方法来实现这个目标。在本文中,我们将讨论如何从IntPtr获取Byte数组,并提供相应的代码示例。

IntPtr和Byte数组的关系

IntPtr是一个平台特定的整数类型,其大小与系统的位数相对应。它通常用于在托管代码和非托管代码之间传递指针或句柄。当我们需要与非托管代码进行交互时,可能会收到一个IntPtr类型的指针,这时我们需要将其转换为我们可以在C#中使用的数据类型,比如Byte数组。

方法一:使用Marshal.Copy()

C#中的`Marshal`类提供了一种简便的方法,可以通过`Copy`方法从IntPtr复制数据到Byte数组中。下面是一个简单的示例代码:

csharp

using System;

using System.Runtime.InteropServices;

class Program

{

static void Main()

{

// 假设ptr是一个IntPtr类型的指针

IntPtr ptr = /*...*/;

// 假设size是要复制的字节数

int size = /*...*/;

// 创建一个Byte数组来存储数据

byte[] byteArray = new byte[size];

// 使用Marshal.Copy()将数据从IntPtr复制到Byte数组

Marshal.Copy(ptr, byteArray, 0, size);

// 现在byteArray包含了从IntPtr中复制的数据

}

}

方法二:使用unsafe代码块

在C#中,我们还可以使用`unsafe`关键字和指针来直接访问内存中的数据。以下是使用unsafe代码块的示例:

csharp

using System;

class Program

{

static unsafe void Main()

{

// 假设ptr是一个IntPtr类型的指针

IntPtr ptr = /*...*/;

// 假设size是要复制的字节数

int size = /*...*/;

// 创建一个Byte数组来存储数据

byte[] byteArray = new byte[size];

// 使用unsafe代码块和指针直接访问内存

fixed (byte* bytePtr = byteArray)

{

byte* sourcePtr = (byte*)ptr;

for (int i = 0; i < size; i++)

{

bytePtr[i] = sourcePtr[i];

}

}

// 现在byteArray包含了从IntPtr中复制的数据

}

}

在C#中,从IntPtr获取Byte数组是与非托管代码交互时常见的任务。本文介绍了两种常见的方法,一是使用`Marshal.Copy()`方法,另一是使用`unsafe`代码块和指针。选择哪种方法取决于具体的需求和代码上下文。确保在使用非托管指针时小心谨慎,以避免引发潜在的安全问题。希望这些示例能够帮助你在C#中成功从IntPtr获取Byte数组。