2013-07-10 21 views
12

Ho uno unsafebyte* che punta a una matrice di byte nativi di lunghezza nota. Come posso convertirlo in byte[]?C# - Converti byte non sicuri * in byte []

Un unsafesbyte* che punta a una stringa nativa terminata da zero può essere convertito in un C# string facilmente, perché c'è un conversion constructor per questo scopo, ma non riesco a trovare un modo semplice per convertire byte* a byte[].

+0

shouldn'y 'byte []' essere 'const byte *' di default? quindi prova a indicizzare il puntatore come '* (indice myByte +);' Ma immagino che se fosse così facile non lo chiederebbe ... – Shark

+0

Dovresti essere in grado di scrivere '* (myByte + index)' come ' myByte [index] '. Nessuna conversione necessaria –

+0

@HenkHolterman Devo convertirlo in byte [] perché devo passarlo al costruttore di IPAddress. – kol

risposta

15

Se ptr è il puntatore non sicuri, e l'array ha lunghezza len, è possibile utilizzare Marshal.Copy in questo modo:

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

Ma mi chiedo come si è venuto da un puntatore non sicuro alla memoria nativa. Hai davvero bisogno di sicurezza qui o puoi risolvere il problema usando IntPtr invece di un puntatore non sicuro? E se è così allora probabilmente non c'è affatto bisogno di codice non sicuro.

+0

Questo sembra buono, stavo suggerendo di attraversare l'array puntato e compilando a mano, o memcpy, ma questo sembra un modo C# di farlo. (y) – Shark

+0

Questa domanda è il seguito di questa: http://stackoverflow.com/questions/17549123/c-sharp-performance-using-unsafe-pointers-instead-of-intptr-and-marshal – kol

+0

I 'Errate verso 'IntPtr' e' Marshal.Copy' se fossi in voi. –

1

La classe Marshal potrebbe aiutarti.

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

Penso che potresti usare anche Marshal.Copy.

+4

Dato che questo deve accadere in un blocco non sicuro, non è necessario 'Marshal.ReadByte' e si può semplicemente usare un buon de-riferimento del puntatore vecchio stile e un incremento del puntatore. Questo è se si desidera eseguire la copia in un ciclo piuttosto che usare 'Marshal.Copy'. –