C# - 将不安全的字节*转换为byte []

时间:2013-07-10 11:24:42

标签: c# pinvoke

我有unsafe byte*指向已知长度的本机字节数组。如何将其转换为byte[]

指向零终止本机字符串的unsafe sbyte*可以很容易地转换为C#string,因为为此目的有conversion constructor,但我无法找到将byte*转换为byte[]的简单方法。

3 个答案:

答案 0 :(得分:17)

如果ptr是您的不安全指针,并且数组的长度为len,则可以使用Marshal.Copy,如下所示:

byte[] arr = new byte[len];
Marshal.Copy((IntPtr)ptr, arr, 0, len);

但我确实想知道你是如何通过一个不安全的指向本机内存的指针来的。你真的需要不安全,或者你可以使用IntPtr代替不安全的指针来解决问题吗?如果是这样的话,根本不需要不安全的代码。

答案 1 :(得分:1)

Marshal课程可以帮到你。

byte[] bytes = new byte[length];
for(int i = 0; i < length; ++i)
  bytes[i] = Marshal.ReadByte(yourPtr, i);

我想你也可以使用Marshal.Copy。

答案 2 :(得分:-1)

使用不安全的方法。

string szString;
int length = 12;    // known length

unsafe
{
    byte* byteArray = (byte*)BufferPtr.ToPointer();

    // if byteArray is ANSI string
    szString = new string((sbyte*)byteArray, 0, length);

    // if byteArray is UNICODE string
    length = length / 2;    // char unit
    szString = new string((char*)byteArray, 0, length);
}