2009-05-06 18 views
28

Ho una funzione che riempie un array di tipo sbyte [], e ho bisogno di passare questo array ad un'altra funzione che accetta un parametro di tipo byte [].Come convertire un sbyte [] in byte [] in C#?

Posso convertirlo bene e rapidamente, senza copiare tutti i dati o usando la magia unsafe?

+0

appena aggiunto un po 'di spazio vuoto al Q, spero che non ti dispiaccia: D – inspite

risposta

42

Sì, è possibile. Poiché sia ​​byte sia sbyte hanno la stessa rappresentazione binaria, non è necessario copiare i dati. Basta fare un cast per Array, quindi lanciarlo su byte[] e sarà sufficiente.

sbyte[] signed = { -2, -1, 0, 1, 2 }; 
byte[] unsigned = (byte[]) (Array)signed; 
+0

Wow, fantastico! Non ci avevo pensato. : P –

+4

Molto spesso ricevo un tipo di array di mismatch usando questo approccio –

+0

Ho provato questo, ma funziona alla perfezione. I risultati sono stati un punto interrogativo. Qualcosa che non ho visto prima. Ecco il codice 'sbyte [] txdata = {(0x00 | 0x20), ~ (1 << 6)}; byte [] dss = (byte []) ((matrice) txdata); ' –

24

Dovrai copiare i dati (solo gli array di tipo di riferimento sono covarianti) - ma possiamo provare a farlo in modo efficiente; Buffer.BlockCopy sembra funzionare:

sbyte[] signed = { -2, -1, 0, 1, 2 }; 
    byte[] unsigned = new byte[signed.Length]; 
    Buffer.BlockCopy(signed, 0, unsigned, 0, signed.Length); 

Se fosse stato un riferimento di tipo, si può semplicemente gettato il riferimento senza duplicare la matrice:

Foo[] arr = { new Foo(), new Foo() }; 
    IFoo[] iarr = (IFoo[])arr; 
    Console.WriteLine(ReferenceEquals(arr, iarr)); // true 
+0

Yup ... ma leggere l'ultima frase della questione. ;) –

+0

Modificato per includere la nota sulla covarianza –

+0

Davvero ??? Stai fornendo una risposta includendo "gli array di tipo di riferimento sono covarianti"? Dai, almeno cerca di essere utile senza il blues semantico auto-gratificante. – BoiseBaked

6

Se si utilizza .NET 3.5+, è possibile utilizzare il seguente:

byte[] dest = Array.ConvertAll(sbyteArray, (a) => (byte)a); 

Quale è, credo che copi efficacemente tutti i dati.

Nota questa funzione è anche in .NET 2.0, ma è necessario utilizzare un metodo anonimo.

+0

Ugh. Preferirei usare Buffer.BlockCopy() quindi. Questo copia almeno ciecamente un mucchio di byte. Questo ha una chiamata di funzione per ognuno di essi. Incubo da prestazione. –

+1

Beh, tutto dipende da quanto stai copiando, ma sì, la copia in blocco ha più senso. Alla fine, se si desidera la sicurezza del tipo, l'unico modo è quello di copiare. Se si desidera convertire (ri-cast) la matrice, l'unica cosa sicura è l'unica strada da percorrere. – Clinton

+0

LOL! Oppure puoi fare la stessa cosa senza l'overhead: byte [] foo = (byte []) (array) firmato; – BoiseBaked

Problemi correlati