Конвертировать байтовый массив в короткий массив в C # - PullRequest
12 голосов
/ 09 июля 2009

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

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

Ответы [ 7 ]

56 голосов
/ 30 октября 2010

Использование Buffer.BlockCopy .

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

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

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

12 голосов
/ 09 июля 2009

Одна возможность использует Enumerable.Select:

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

Другой вариант использования Array.ConvertAll:

byte[] bytes;
var shorts = Array.ConvertAll(bytes, b => (short)b);
3 голосов
/ 09 августа 2009

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

short s = (short)(bytes[0] | (bytes[1] << 8))
1 голос
/ 30 апреля 2010
short value = BitConverter.ToInt16(bytes, index);
0 голосов
/ 15 ноября 2016

Не знаю, но я бы ожидал другого подхода к этому вопросу. При преобразовании последовательности байтов в последовательность шортов, я бы сделал это так, как @Peter сделал

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

или

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

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

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

0 голосов
/ 09 июля 2009
byte[] bytes;
var shorts = bytes.Select(n => System.Convert.ToInt16(n)).ToArray();
0 голосов
/ 09 июля 2009
 short[] wordArray = Array.ConvertAll(byteArray, (b) => (short)b);
...