Aktualnie czytam plik i chciałem przekonwertować tablicę bajtów uzyskanych z pliku na krótką tablicę.Konwertuj tablicę bajtów na krótką tablicę w C#
Jak miałbym to zrobić?
Aktualnie czytam plik i chciałem przekonwertować tablicę bajtów uzyskanych z pliku na krótką tablicę.Konwertuj tablicę bajtów na krótką tablicę w C#
Jak miałbym to zrobić?
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);
Twoja oryginalna sugestia (przed dodaniem drugiej) jest niewydajna. –
Inną opcją byłby bajty. Cask
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
short[] wordArray = Array.ConvertAll(byteArray, (b) => (short)b);
byte[] bytes;
var shorts = bytes.Select(n => System.Convert.ToInt16(n)).ToArray();
To bardzo nieefektywne: wywołanie convert.ToInt16() dla każdego elementu, przechowywanie go na liście tymczasowej, a następnie kopiowanie do nowej tablicy. –
tak, jest to nieefektywne. Myślę, że jest to bezpieczniejsze, niż rzucanie. –
Bezpieczniejszy niż odlewanie? Godzina bajtów do krótkich zawsze działa. Nigdy nie może wyrzucić wyjątku –
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))
short value = BitConverter.ToInt16(bytes, index);
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.
Rozwiązanie, na które nie zasługuję, ale to, którego potrzebuję już teraz! – DaMachk
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.
Czy chcesz przekonwertować 1 bajt na 1 krótki lub 2 bajty na 1 krótki? – maxwellb