2013-07-10 45 views
12

我有一個unsafebyte*指向已知長度的本地字節數組。我怎樣才能將它轉換爲byte[]C# - 將不安全的字節*轉換爲字節[]

一個unsafesbyte*指向零結尾的本地字符串可以被轉換成一個C#string容易,因爲用於此目的的conversion constructor,但我無法找到一個簡單的方法來byte*轉換爲byte[]

+0

應該默認'byte []'是'const byte *'嗎?所以試着將指針索引爲'*(myByte + index);'但是我想如果那樣容易,你就不會問...... – Shark

+0

你應該可以將'*(myByte + index)'寫成' myByte [指數]'。不需要轉換。 –

+0

@HenkHolterman我必須將其轉換爲byte [],因爲我必須將它傳遞給IPAddress的構造函數。 – kol

回答

15

如果ptr是你的不安全的指針,數組長度爲len,您可以使用Marshal.Copy這樣的:

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

但我不知道你是怎麼來通過一個不安全的指針指向本機內存。你真的需要在這裏不安全,或者你可以通過使用IntPtr而不是一個不安全的指針來解決問題嗎?如果是這樣,那麼可能根本就不需要不安全的代碼。

+0

這看起來不錯,我會建議遍歷指向數組和手工填充或memcpy,但這看起來像是C#的方式。 (y) – Shark

+0

這個問題是這一個的後續:http://stackoverflow.com/questions/17549123/c-sharp-performance-using-unsafe-pointers-instead-of-intptr-and-marshal – kol

+0

我如果我是你的話,可能會錯過「IntPtr」和「Marshal.Copy」。 –

1

Marshal類可以幫助你。

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

我想你也可以使用Marshal.Copy。

+4

因爲這必須發生在一個不安全的塊中,所以你不需要'Marshal.ReadByte',你可以使用舊的老式指針去引用和指針增量。那就是如果你想在一個循環中執行拷貝而不是使用'Marshal.Copy'。 –