我有一個unsafe
byte*
指向已知長度的本地字節數組。我怎樣才能將它轉換爲byte[]
?C# - 將不安全的字節*轉換爲字節[]
一個unsafe
sbyte*
指向零結尾的本地字符串可以被轉換成一個C#string
容易,因爲用於此目的的conversion constructor,但我無法找到一個簡單的方法來byte*
轉換爲byte[]
。
我有一個unsafe
byte*
指向已知長度的本地字節數組。我怎樣才能將它轉換爲byte[]
?C# - 將不安全的字節*轉換爲字節[]
一個unsafe
sbyte*
指向零結尾的本地字符串可以被轉換成一個C#string
容易,因爲用於此目的的conversion constructor,但我無法找到一個簡單的方法來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。
因爲這必須發生在一個不安全的塊中,所以你不需要'Marshal.ReadByte',你可以使用舊的老式指針去引用和指針增量。那就是如果你想在一個循環中執行拷貝而不是使用'Marshal.Copy'。 –
應該默認'byte []'是'const byte *'嗎?所以試着將指針索引爲'*(myByte + index);'但是我想如果那樣容易,你就不會問...... – Shark
你應該可以將'*(myByte + index)'寫成' myByte [指數]'。不需要轉換。 –
@HenkHolterman我必須將其轉換爲byte [],因爲我必須將它傳遞給IPAddress的構造函數。 – kol