Преобразовать массив байтов в короткий массив в C#

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

Как бы я это сделал?

7 ответов


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

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

другое использовать Array.ConvertAll:

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

использовать буфера.BlockCopy.

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

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

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


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

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

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

 short[] wordArray = Array.ConvertAll(byteArray, (b) => (short)b);

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

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

или

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

в зависимости от endianess байтов в файл.

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


byte[] bytes;
var shorts = bytes.Select(n => System.Convert.ToInt16(n)).ToArray();