2009-05-06 27 views
28

Tengo una función que llena una matriz de tipo sbyte [], y necesito pasar esta matriz a otra función que acepta un parámetro de tipo byte [].Cómo convertir un sbyte [] en byte [] en C#?

¿Puedo convertirlo muy bien y rápidamente, sin copiar todos los datos o usar magia unsafe?

+0

acaba de agregar un poco de espacio en blanco a la Q, espero que no le importa: D – inspite

Respuesta

42

Sí, puedes. Dado que tanto byte como sbyte tienen la misma representación binaria, no es necesario copiar los datos. Solo haz un yeso en Array, luego échalo al byte[] y será suficiente.

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

¡Guau! ¡Increíble! No había pensado en esto. : P –

+4

A menudo recibo un tipo de matriz no coincidente usando este enfoque –

+0

Lo intenté pero no funciona. Los resultados fueron signo de interrogación. Algo que no he visto antes Aquí está el código 'sbyte [] txdata = {(0x00 | 0x20), ~ (1 << 6)}; byte [] dss = (byte []) ((Array) txdata); ' –

24

Deberá copiar los datos (solo las matrices de tipo de referencia son covariantes), pero podemos tratar de hacerlo de manera eficiente; Buffer.BlockCopy parece funcionar:

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

Si se trata de un tipo de referencia, solo se puede lanzar la referencia sin duplicar la matriz:

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

Sí ... pero leer la última frase de la cuestión. ;) –

+0

Editado para incluir una nota sobre la covarianza –

+0

¿Realmente? ¿Está proporcionando una respuesta al incluir "matrices de tipo de referencia son covariantes"? Vamos, al menos trata de ser útil sin la gratificación semántica gratificante. – BoiseBaked

6

Si está utilizando .NET 3.5 +, puede utilizar el siguiente:

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

Cuál es, supongo que con eficacia copiando todos los datos.

Tenga en cuenta que esta función también está en .NET 2.0, pero en su lugar tendría que usar un método anónimo.

+0

Ugh. Prefiero usar Buffer.BlockCopy() entonces. Eso al menos copia ciegamente un grupo de bytes. Este tiene una llamada de función para cada uno de ellos. Pesadilla de rendimiento. –

+1

Bueno, todo depende de cuánto está copiando, pero sí, la copia en bloque tiene más sentido. Al final, si desea seguridad tipo, la única forma es copiar. Si desea convertir (volver a emitir) la matriz, lo inseguro es la única manera de hacerlo. – Clinton

+0

¡LOL! O puede hacer lo mismo sin la sobrecarga: byte [] foo = (byte []) (Array) signed; – BoiseBaked