2009-07-09 26 views

risposta

14

Una possibilità è utilizzare Enumerable.Select:

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

altro è usare Array.ConvertAll:

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

Il tuo suggerimento originale (prima di aver aggiunto il secondo in seguito) è piuttosto inefficiente –

+1

Un'altra opzione sarebbe byte.Cast () .ToArray(); –

+0

In realtà, questo risulta in InvalidCastException. La breve spiegazione è che questo codice causa implicitamente la cancellazione di un byte in box su un cortocircuito che non è un'operazione di unboxing valida. Per maggiori dettagli, consulta 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

Ciò è estremamente inefficiente: chiamata convert.ToInt16() per ogni elemento, memorizzandolo in un elenco temporaneo e quindi copiandolo in un nuovo array. –

+0

sì, è inefficiente. Penso che sia più sicuro, quindi, il casting. –

+0

Più sicuro del casting? Un cast di byte to short funziona sempre. Non può mai generare un'eccezione –

2

Uno shorthard è un composto di due byte. Se stai scrivendo tutti i cortometraggi sul file come corti veri, allora quelle conversioni sono sbagliate. È necessario utilizzare due byte per ottenere il vero valore breve, utilizzando qualcosa di simile:

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

Questo non funziona.Devi farlo in questo modo per farlo funzionare: breve s = (breve) ((byte [0] << 8) | byte [1]); – DaveN59

+3

Supponendo little endian, questo dovrebbe essere: short s = (short) (byte [0] | (byte [1] << 8)) – Indy9000

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

Usa Buffer.BlockCopy.

Creare la breve serie alla metà della dimensione della matrice di byte, e copiare i dati di byte in:

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

E 'il metodo più veloce di gran lunga.

+1

La soluzione che non merito, ma quella di cui ho bisogno in questo momento! – DaMachk

0

Non lo so, ma mi sarei aspettato un altro approccio a questa domanda. Quando si converte una sequenza di byte in una sequenza di corti, avrei fatto lo ha fatto come @Peter

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

o

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

seconda endianess dei byte del file.

Ma l'OP non ha menzionato il suo utilizzo dei cortometraggi o la definizione dei cortometraggi nel file. Nel suo caso non avrebbe senso convertire l'array di byte in un array breve, perché richiederebbe il doppio della memoria, e dubito che un byte sarebbe necessario per essere convertito in short se usato altrove.