既知の長さのネイティブバイト配列を指すunsafe
byte*
があります。どうすればbyte[]
に変換できますか?
ゼロで終了するネイティブ文字列を指すunsafe
sbyte*
は、この目的のために 変換コンストラクター があるため、C#string
に簡単に変換できます。 、しかし、byte*
をbyte[]
に変換する簡単な方法が見つかりません。
ptr
が安全でないポインタであり、配列の長さがlen
の場合、次のようにMarshal.Copy
を使用できます。
byte[] arr = new byte[len];
Marshal.Copy((IntPtr)ptr, arr, 0, len);
しかし、どうしてネイティブメモリへの安全でないポインタが来たのだろうか。ここで本当に安全でない必要がありますか、それとも安全でないポインタの代わりにIntPtr
を使用して問題を解決できますか?もしそうなら、おそらく安全でないコードはまったく必要ありません。
Marshal クラスが役に立ちます。
byte[] bytes = new byte[length];
for(int i = 0; i < length; ++i)
bytes[i] = Marshal.ReadByte(yourPtr, i);
Marshal.Copyも使うかもしれないと思います。