web-dev-qa-db-ja.com

C#IntPtrからByte []を取得する方法

デリゲートを持つ.dll(自分のものではない)があります。このデリゲートコールバック関数は次のとおりです。
"CallBackFN(ushort opCOde、IntPtr payload、uint size、uint localIP)"

IntPtrをByte []に​​変換するにはどうすればよいですか?ペイロードは実際にはByte []だと思います。それがByte []ではなく、他の何かである場合、データが失われますか?

36
Gabriel
21
Brandon Moretz

バイトの場合:

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

バイトでない場合、Marshal.Copyのサイズパラメーターは、バイトサイズではなく配列内の要素の数です。したがって、byte []配列ではなくint []配列がある場合、コールバックを介して渡されるsizeパラメーターがバイト数。

45
jlew

パフォーマンスが必要な場合は、直接使用してください。

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);
        }
    }
}
17
lama12345

このスタックオーバーフローの質問 によると、次のことができます。

var byteArray = new byte[dataBlockSize];
System.Runtime.InteropServices.Marshal.Copy(payload, byteArray, 0, dataBlockSize);
6
Justin Morgan