Domanda

Sto cercando di creare un array gestito dei doppi da un array di byte. Ho il problema di lavoro attualmente, ma ho voluto ottimizzare. Ecco un po 'di codice che mi piacerebbe lavorare:

private unsafe static double[] _Get_Doubles(byte[] _raw_data)
{
    double[] ret;
    fixed (byte* _pd = _raw_data)
    {
        double* _pret = (double*)_pd;
        ret = (double[])*_pret; //FAILURE
    }
}

Per favore fatemi sapere come affrontare questi problemi.

-Aaron

È stato utile?

Soluzione 2

Proprio ora, ho pensato che stackalloc sarebbe la strada giusta, ma fallisce. Ancora più importante, ora so che era destinato a fallire. Non c'è modo di fare ciò che voglio fare.

Questo può essere visto ribadendo la domanda:

Come posso creare un array gestito intorno una serie 'non sicuro'?

Poiché una matrice gestita ha informazioni di intestazione (perché è una classe intorno ad un mandrino di memoria), richiede più spazio di memoria della matrice stessa. Quindi, la risposta è:

Assegnare spazio prima (e / o dopo? Seconda del modo array gestiti sono memorizzati nella memoria) della matrice stessa e mettere informazioni gestite (lunghezza, (eccetera)) attorno alla matrice 'pericoloso'.

Questa non è facilmente possibile in quanto per garantire che non ci sono dati sufficienti intorno l'array è traballante al meglio. Nel mio esempio particolare ci può essere spazio sufficiente per esso perché un byte gestito è passato [] nel senso che non ci sono dati intorno alla matrice, ma per affermare che gli stessi dati è appropriato per gestito doppia [] è dubbia nel migliore dei casi, ma la maggior parte probabilmente erronea, e per modificare i dati per rendere più appropriato per gestito doppia [] è nefasto.

[EDIT]

Sembra che Marshal.Copy è il modo di andare qui. Creare un nuovo array e lasciare che il maresciallo copiarli (sperando che egli sarà più veloce di me, o che forse in una data successiva, che sarà più veloce):

var ret = new double[_raw_data.Length / sizeof(double)];
System.Runtime.InteropServices.Marshal.Copy(new System.IntPtr(_pret), ret, 0, ret.Length);

Altri suggerimenti

Una delle cose principali da notare circa il codice che hai postato è che non c'è modo di sapere quanti articoli sono a cui punta il valore di ritorno, e una serie riuscito ha bisogno di sapere quanto è grande. È possibile restituire un double* o creare un new double[XXX] e copiare i valori o anche (se il conteggio è costante) creare un struct con un membro public fixed double _data[2]; e gettato i dati grezzi a quel tipo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top