53

我有一个有委托的 .dll(不是我自己的)。此委托回调函数为:
“CallBackFN(ushort opCOde, IntPtr payload , uint size, uint localIP)”

如何将 IntPtr 转换为 Byte[]?我认为有效载荷实际上是字节[]。如果不是 Byte[] 而是别的东西,我会丢失一些数据吗?

4

6 回答 6

64

如果是byte[]数组:

 byte[] managedArray = new byte[size];
 Marshal.Copy(pnt, managedArray, 0, size);

如果不是byte[],则 Marshal.Copy 中的 size 参数是数组中的元素个数,而不是字节大小。因此,如果您有一个int[]数组而不是byte[]数组,则必须除以 4(每个 int 的字节数)才能获得要复制的正确元素数,假设您通过回调传递的 size 参数指的是字节数。

于 2011-03-30T13:32:45.000 回答
24

你看过 Marshal.Copy 吗?

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.copy.aspx

于 2011-03-30T13:30:41.633 回答
24

如果需要性能,直接使用:

unsafe { 
    byte *ptr = (byte *)buffer.ToPointer();

    int offset = 0;
    for (int i=0; i<height; i++)
    {
        for (int j=0; j<width; j++)
        {

            float b = (float)ptr[offset+0] / 255.0f;
            float g = (float)ptr[offset+1] / 255.0f;
            float r = (float)ptr[offset+2] / 255.0f;
            float a = (float)ptr[offset+3] / 255.0f;
            offset += 4;

            UnityEngine.Color color = new UnityEngine.Color(r, g, b, a);
            texture.SetPixel(j, height-i, color);
        }
    }
}
于 2015-02-02T13:36:56.373 回答
10

根据这个 Stack Overflow question,您可以执行以下操作:

var byteArray = new byte[dataBlockSize];
System.Runtime.InteropServices.Marshal.Copy(payload, byteArray, 0, dataBlockSize);
于 2011-03-30T13:31:27.360 回答
7

Span<byte>可能是一个更好的解决方案,因为它提供了字节数组所需的大多数功能。它更快,因为您不需要分配和复制到新缓冲区,并且更安全,因为您不必直接使用指针。

IntPtr ptr = ... ; 
int ptrLength = ...; 


unsafe
{
    Span<byte> byteArray = new Span<byte>(ptr.ToPointer(), ptrLength);

    for (int i = 0; i < byteArray.Length; i++ )
    {
        // Use it as normalarray array ;
        byteArray[i] = 6;
    }

    // You can always get a byte array . Caution, it allocates a new buffer
    byte[] realByteArray = byteArray.ToArray();
}

它包含在 .NET Core 2.1 和.NET Framework 4.5 + 和 .NET Core 2.0 +的nuget 包 (System.Memory)中;

于 2019-12-12T11:54:07.067 回答
4

您可以使用Marshal.Copy 方法 (IntPtr, Byte[], Int32, Int32)

于 2011-03-30T13:31:09.913 回答