Ho un rawint denominato IntPtr, che punta a una matrice di dati di 10 MB, valori a 16 bit. Ho bisogno di restituire un array ushort gestito da quello. Il seguente codice funziona ma c'è un BlockCopy in più di cui mi piacerebbe sbarazzarmi. Marshal.Copy non supporta l'ushort. Cosa posso fare? (FYI: le rawbits è riempito in da una scheda framegrabber video in memoria non gestita)Copia dall'array IntPtr (16 bit) all'host gestito
public const int width = 2056;
public const int height = 2048;
public const int depth = 2;
public System.IntPtr rawbits;
public ushort[] bits()
{
ushort[] output = new ushort[width * height];
short[] temp = new short[width * height];
Marshal.Copy(rawbits, temp, 0, width * height);
System.Buffer.BlockCopy(temp, 0, output, 0, width * height * depth);
return output;
}
I suggerimenti riportati nella seguente domanda non ha aiutato. (errore del compilatore).
C# Marshal.Copy Intptr to 16 bit managed unsigned integer array
[proposito, la breve matrice ha unsigned dati a 16 bit in esso. Marshal.Copy() non rispetta il segno, ed è quello che voglio. Ma preferirei non solo fingere che il corto [] sia un ushort []]
Si dovrebbe usare 'fixed' quando si converte l'array in un puntatore –
' fixed' non può essere usato per creare un metodo generico 'Copia()' perché 'fixed (T * ptr = array)' non verrebbe compilato. Non esiste un vincolo generico per consentirlo. Anche 'fixed' richiede l'opzione' unssafe', mentre l'uso di 'GCHandle' no. –
max
Grandi risposte. Qualche intuizione come la classifica in ordine di prestazione? [Non che io faccia questa conversione nello spazio gestito in modalità normale, ma per il debug è utile deviare il traffico a 25 fps verso l'host, invece di inviarlo alla GPU per l'elaborazione). –