Конвертировать байтовый массив в короткий массив в C #

Я сейчас читаю файл и хотел бы иметь возможность преобразовать массив байтов, полученных из файла, в короткий массив.

Как бы я поступил так?

 maxwellb09 июл. 2009 г., 17:27
Вы хотите преобразовать 1 байт в 1 короткий или 2 байта в 1 короткий?

Ответы на вопрос(7)

Buffer.BlockCopy.

Создайте короткий массив в половине размера байтового массива и скопируйте байтовые данные в:

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

Это самый быстрый метод на сегодняшний день.

 19 дек. 2018 г., 13:18
Спасибо! Отличный ответ, но мне пришлось немного изменить код: short [] sdata = new short [(int) Math.Ceiling (data.Length / 2.0)] ;. В противном случае я получил бы следующую ошибку: "Вызов неоднозначен между следующими методами или свойствами:" Math.Ceiling (decimal) " и «Math.Ceiling (double)»; & Quot;
 16 апр. 2016 г., 20:26
Решение, которого я не заслуживаю, но которое мне нужно прямо сейчас!

файл как настоящие шорты, тогда эти преобразования неверны. Вы должны использовать два байта, чтобы получить истинное короткое значение, используя что-то вроде:

short s = (short)(bytes[0] | (bytes[1] << 8))
 03 дек. 2009 г., 22:12
Это не работает. Вы должны сделать это следующим образом: short s = (short) ((bytes [0] & lt; & lt; 8) | bytes [1]);
 31 мая 2011 г., 18:45
Предполагая, что порядок байтов меньше, это должно быть: short s = (short) (bytes [0] | (bytes [1] & lt; & lt; 8))

При преобразовании последовательности байтов в последовательность шортов, я бы сделал это так, как сделал @Peter

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

или же

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

в зависимости от порядка байтов в файле.

Но ОП не упомянул его использование шорт или определение шорт в файле. В его случае не имело бы смысла преобразовывать байтовый массив в короткий массив, потому что это заняло бы вдвое больше памяти, и я сомневаюсь, что байт понадобится для преобразования в короткий при использовании в другом месте.

Решение Вопроса

Enumerable.Select:

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

Другой, чтобы использоватьArray.ConvertAll:

byte[] bytes;
var shorts = Array.ConvertAll(bytes, b => (short)b);
 09 июл. 2009 г., 17:35
Ваше первоначальное предложение (до того, как вы добавили второе позже) довольно неэффективно
 09 авг. 2009 г., 06:04
Другой вариант был бы bytes.Cast & lt; short & gt; (). ToArray ();
 29 нояб. 2015 г., 23:57
Когда я использовал var shorts [] = Array.ConvertAll (bytes, b = & gt; (short) b); Я преобразовал каждый байт в короткий, а не каждую пару преобразованных байтов.
 19 авг. 2009 г., 08:56
На самом деле это приводит к исключению InvalidCastException. Краткое объяснение состоит в том, что этот код неявно заставляет упакованный байт быть распакованным в короткий, что не является допустимой операцией распаковки. Подробнее см.stackoverflow.com/questions/445471/….
short value = BitConverter.ToInt16(bytes, index);
 12 сент. 2018 г., 22:40
Этот используетindex как LSB иindex+1 как MSB. Есть ли тот, который следует BigEndian для использованияindex как MSB?
byte[] bytes;
var shorts = bytes.Select(n => System.Convert.ToInt16(n)).ToArray();
 09 июл. 2009 г., 17:30
Это крайне неэффективно: вызывать convert.ToInt16 () для каждого элемента, сохранять его во временном списке и затем копировать в новый массив.
 09 июл. 2009 г., 18:09
да, это неэффективно. Я думаю, что это безопаснее, чем кастинг.
 09 июл. 2009 г., 18:24
Безопаснее, чем кастинг? Приведение байта к короткому всегда работает. Это никогда не может бросить исключение
 short[] wordArray = Array.ConvertAll(byteArray, (b) => (short)b);

Ваш ответ на вопрос