53

デリゲートを持つ .dll (自分のものではない) があります。このデリゲート コールバック関数は次
のとおりです

IntPtr を Byte[] に変換するにはどうすればよいですか? ペイロードは実際には 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 あたりのバイト数) で除算する必要があります。これは、コールバックを介して渡されたサイズ パラメーターがバイト数を参照していると仮定した場合です。

于 2011-03-30T13:32:45.000 に答える
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 に答える
24

Marshal.Copy を調べましたか?

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

于 2011-03-30T13:30:41.633 に答える
10

この Stack Overflow questionによると、次のことができます。

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

Marshal.Copy メソッドを使用できます(IntPtr、Byte[]、Int32、Int32)

于 2011-03-30T13:31:09.913 に答える