デリゲートを持つ .dll (自分のものではない) があります。このデリゲート コールバック関数は次
のとおりです。
IntPtr を Byte[] に変換するにはどうすればよいですか? ペイロードは実際には Byte[] だと思います。それがByte[]ではなく、それ以外の場合、データが失われますか?
byte[]
配列の場合:
byte[] managedArray = new byte[size];
Marshal.Copy(pnt, managedArray, 0, size);
そうでない場合byte[]
、Marshal.Copy の size パラメーターは、バイト サイズではなく、配列内の要素の数です。したがって、int[]
配列ではなく配列byte[]
がある場合、コピーする要素の正しい数を取得するには、4 (int あたりのバイト数) で除算する必要があります。これは、コールバックを介して渡されたサイズ パラメーターがバイト数を参照していると仮定した場合です。
パフォーマンスが必要な場合は、直接使用してください。
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);
}
}
}
Marshal.Copy を調べましたか?
http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.copy.aspx
この Stack Overflow questionによると、次のことができます。
var byteArray = new byte[dataBlockSize];
System.Runtime.InteropServices.Marshal.Copy(payload, byteArray, 0, dataBlockSize);
Marshal.Copy メソッドを使用できます(IntPtr、Byte[]、Int32、Int32)