Attualmente sto leggendo un file e volevo essere in grado di convertire l'array di byte ottenuti dal file in un array breve.Converte array di byte in cortocircuito in C#
Come faccio a fare questo?
Attualmente sto leggendo un file e volevo essere in grado di convertire l'array di byte ottenuti dal file in un array breve.Converte array di byte in cortocircuito in C#
Come faccio a fare questo?
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);
Il tuo suggerimento originale (prima di aver aggiunto il secondo in seguito) è piuttosto inefficiente –
Un'altra opzione sarebbe byte.Cast
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
short[] wordArray = Array.ConvertAll(byteArray, (b) => (short)b);
byte[] bytes;
var shorts = bytes.Select(n => System.Convert.ToInt16(n)).ToArray();
Ciò è estremamente inefficiente: chiamata convert.ToInt16() per ogni elemento, memorizzandolo in un elenco temporaneo e quindi copiandolo in un nuovo array. –
sì, è inefficiente. Penso che sia più sicuro, quindi, il casting. –
Più sicuro del casting? Un cast di byte to short funziona sempre. Non può mai generare un'eccezione –
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))
short value = BitConverter.ToInt16(bytes, index);
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.
La soluzione che non merito, ma quella di cui ho bisogno in questo momento! – DaMachk
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.
Vuoi convertire 1 byte in 1 corto o 2 byte in 1 corto? – maxwellb