web-dev-qa-db-ja.com

C#-安全でないバイト*をbyte []に​​変換します

既知の長さのネイティブバイト配列を指すunsafebyte*があります。どうすればbyte[]に変換できますか?

ゼロで終了するネイティブ文字列を指すunsafesbyte*は、この目的のために 変換コンストラクター があるため、C#stringに簡単に変換できます。 、しかし、byte*byte[]に変換する簡単な方法が見つかりません。

15
kol

ptrが安全でないポインタであり、配列の長さがlenの場合、次のようにMarshal.Copyを使用できます。

byte[] arr = new byte[len];
Marshal.Copy((IntPtr)ptr, arr, 0, len);

しかし、どうしてネイティブメモリへの安全でないポインタが来たのだろうか。ここで本当に安全でない必要がありますか、それとも安全でないポインタの代わりにIntPtrを使用して問題を解決できますか?もしそうなら、おそらく安全でないコードはまったく必要ありません。

19
David Heffernan

Marshal クラスが役に立ちます。

byte[] bytes = new byte[length];
for(int i = 0; i < length; ++i)
  bytes[i] = Marshal.ReadByte(yourPtr, i);

Marshal.Copyも使うかもしれないと思います。

1
dotixx