2009-07-09 30 views

Respuesta

14

Una posibilidad es el uso de Enumerable.Select:

byte[] bytes; 
var shorts = bytes.Select(b => (short)b).ToArray(); 

Otra es usar Array.ConvertAll:

byte[] bytes; 
var shorts = Array.ConvertAll(bytes, b => (short)b); 
+0

Su sugerencia original (antes de agregar la segunda más adelante) es bastante ineficiente –

+1

Otra opción serían los bytes.Cast () .ToArray(); –

+0

En realidad, esto da como resultado una InvalidCastException. La breve explicación es que este código provoca implícitamente que un byte encuadrado se desempaquete en un corto que no es una operación de unboxing válida. Para obtener detalles, consulte http://stackoverflow.com/questions/445471/puzzling-enumerable-cast-invalidcastexception. – jason

0
short[] wordArray = Array.ConvertAll(byteArray, (b) => (short)b); 
-2
byte[] bytes; 
var shorts = bytes.Select(n => System.Convert.ToInt16(n)).ToArray(); 
+0

Eso es extremadamente ineficiente: llamar a convert.ToInt16() para cada elemento, almacenarlo en una lista temporal y luego copiarlo en una nueva matriz. –

+0

sí, es ineficiente. Estoy pensando que es más seguro, sin embargo, el casting. –

+0

¿Más seguro que el casting? Un molde de byte a corto siempre funciona. Nunca puede arrojar una excepción –

2

A shorthard es un compuesto de dos bytes. Si está escribiendo todos los cortos en el archivo como verdaderos cortos, entonces esas conversiones son incorrectas. Debe utilizar dos bytes para obtener el verdadero valor a corto, usando algo como:

short s = (short)(bytes[0] | (bytes[1] << 8)) 
+0

Esto no funciona.Tienes que hacerlo así para que funcione: short s = (short) ((bytes [0] << 8) | bytes [1]); – DaveN59

+3

Asumiendo little endian, esto debería ser: short s = (short) (bytes [0] | (bytes [1] << 8)) – Indy9000

2
short value = BitConverter.ToInt16(bytes, index); 
48

Uso Buffer.BlockCopy.

Crear el corto matriz en la mitad del tamaño de la matriz de bytes, y copia los datos en bytes:

short[] sdata = new short[(int)Math.Ceiling(data.Length/2)]; 
Buffer.BlockCopy(data, 0, sdata, 0, data.Length); 

Es el método más rápido con diferencia.

+1

¡La solución que no merezco, pero la que necesito ahora mismo! – DaMachk

0

No lo sé, pero hubiera esperado otro acercamiento a esta pregunta. Al convertir una secuencia de bytes en una secuencia de pantalones cortos, habría que hacer como hicieron @Peter

short s = (short)(bytes[0] | (bytes[1] << 8)) 

o

short s = (short)((bytes[0] << 8) | bytes[1]) 

dependiendo de endianess de los bytes en el archivo.

Pero el OP no menciona su uso de los pantalones cortos o la definición de los cortos en el archivo. En este caso, no tendría sentido convertir la matriz de bytes en una matriz corta, ya que se necesitaría el doble de memoria, y dudo que se necesite convertir un byte en un corto cuando se use en otro lugar.

Cuestiones relacionadas