Actualmente estoy leyendo un archivo y quería poder convertir la matriz de bytes obtenida del archivo en una matriz corta.Convertir matriz de bytes a matriz corta en C#
¿Cómo voy a hacer esto?
Actualmente estoy leyendo un archivo y quería poder convertir la matriz de bytes obtenida del archivo en una matriz corta.Convertir matriz de bytes a matriz corta en C#
¿Cómo voy a hacer esto?
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);
Su sugerencia original (antes de agregar la segunda más adelante) es bastante ineficiente –
Otra opción serían los bytes.Cast
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
short[] wordArray = Array.ConvertAll(byteArray, (b) => (short)b);
byte[] bytes;
var shorts = bytes.Select(n => System.Convert.ToInt16(n)).ToArray();
Eso es extremadamente ineficiente: llamar a convert.ToInt16() para cada elemento, almacenarlo en una lista temporal y luego copiarlo en una nueva matriz. –
sí, es ineficiente. Estoy pensando que es más seguro, sin embargo, el casting. –
¿Más seguro que el casting? Un molde de byte a corto siempre funciona. Nunca puede arrojar una excepción –
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))
short value = BitConverter.ToInt16(bytes, index);
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.
¡La solución que no merezco, pero la que necesito ahora mismo! – DaMachk
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.
¿Quieres convertir de 1 byte a 1 abreviatura, o de 2 a 1 abreviaturas? – maxwellb