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

20

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

unsafe sbyte* 指向以零终止的本地字符串可以轻松转换为C#的string,因为有一个转换构造函数可以实现这个目的,但是我找不到将byte*转换为byte[]的简单方法。


默认情况下,byte[] 不应该是 const byte* 吗?所以尝试将指针索引为 *(myByte+index); 但我猜如果这么容易你就不会问了... - Shark
你应该能够将 *(myByte+index) 写成 myByte[index],无需进行转换。 - H H
@HenkHolterman 我必须将它转换为byte[],因为我需要将其传递给IPAddress的构造函数。 - kol
但是你需要安全(托管)的 byte[] 吗? - H H
@HenkHolterman IPAddress构造函数需要一个安全/托管的byte[]:http://msdn.microsoft.com/en-us/library/t4k07yby.aspx - kol
2个回答

24

如果ptr是您的不安全指针,而数组的长度为len,则可以像这样使用Marshal.Copy

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

但我确实想知道你是如何获取到指向本地内存的不安全指针的。你真的需要使用不安全指针吗?或者您可以通过使用 IntPtr 替代不安全指针来解决问题吗?如果是这样,那么可能根本没有必要使用不安全代码。


1
这看起来不错,我本来想建议遍历指向的数组并手动填充,或者使用memcpy,但这似乎是C#的做法。 (y) - Shark
这个问题是对这个问题的跟进:https://dev59.com/6GMm5IYBdhLWcg3whfSe - kol
如果我是你,我会倾向于使用 IntPtrMarshal.Copy - David Heffernan
我能否在不使用new(可能会占用大量内存)的情况下完成上述操作 - 只是引用相同的内存? - Eitan
@Eitan 是的,可以使用 Span<T> - David Heffernan
显示剩余5条评论

1

Marshal类可以帮助你。

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

我认为您也可以使用Marshal.Copy。


4
由于这个操作必须在一个不安全的代码块中进行,因此您不需要使用 Marshal.ReadByte,而是可以使用传统的指针解引用和指针递增。如果您想要在循环中执行复制操作,而不是使用 Marshal.Copy,那么这种方法就可以派上用场。 - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接