2009-07-09 16 views

Odpowiedz

14

Jedną z możliwości jest użycie Enumerable.Select:

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

Inny sposób polega na użyciu Array.ConvertAll:

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

Twoja oryginalna sugestia (przed dodaniem drugiej) jest niewydajna. –

+1

Inną opcją byłby bajty. Cask () .ToArray(); –

+0

W rzeczywistości powoduje to wyjątek InvalidCastException. Krótkie wyjaśnienie jest takie, że ten kod pośrednio powoduje, że bajt w ramce jest rozpakowywany na krótki, który nie jest prawidłową operacją rozpakowywania. Szczegółowe informacje można znaleźć na stronie 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

To bardzo nieefektywne: wywołanie convert.ToInt16() dla każdego elementu, przechowywanie go na liście tymczasowej, a następnie kopiowanie do nowej tablicy. –

+0

tak, jest to nieefektywne. Myślę, że jest to bezpieczniejsze, niż rzucanie. –

+0

Bezpieczniejszy niż odlewanie? Godzina bajtów do krótkich zawsze działa. Nigdy nie może wyrzucić wyjątku –

2

shorthard jest związek z dwóch bajtów. Jeśli piszesz wszystkie skróty do pliku jako prawdziwe szorty, to te konwersje są błędne. Musisz użyć dwóch bajtów, aby uzyskać prawdziwy krótki wartość, używając coś takiego:

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

To nie działa.Trzeba to zrobić tak, aby działało: short s = (short) ((bytes [0] << 8) | bytes [1]); – DaveN59

+3

Zakładając, że little endian, powinno to być: short s = (short) (bytes [0] | (bytes [1] << 8)) – Indy9000

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

Korzystając Buffer.BlockCopy.

Tworzenie krótkiej tablicę na pół rozmiaru tablicy bajtów, a następnie skopiować dane bajt:

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

Jest to najszybsza metoda zdecydowanie.

+1

Rozwiązanie, na które nie zasługuję, ale to, którego potrzebuję już teraz! – DaMachk

0

Nie wiem, ale oczekiwałbym innego podejścia do tego pytania. Podczas konwersji sekwencja bajtów do sekwencji spodenek, to byłoby to zrobić tak @Peter nie

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

lub

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

zależności kolejność bajtów bajtów w pliku.

Ale OP nie wspominał o użyciu szortów ani definicji szortów w pliku. W jego przypadku nie ma sensu przekształcanie tablicy bajtów w krótką tablicę, ponieważ wymagałoby to dwukrotnej ilości pamięci i wątpię, czy bajt byłby potrzebny do przekonwertowania na krótki, gdy jest używany gdzie indziej.

Powiązane problemy