Преобразование массива из 2 последовательных байтов в целые числа быстрее

У меня есть «огромный» объем данных, который может варьироваться от 50 до 100 мегабайт. Я читаю эти данные в виде массива байтов, используя файловый стример.

Дело в том, что я хочу преобразовать все последовательные 2 байта в целое число. Как я это делаю, я перебираю массив байтов с размером шага два, а затем использую BitConvert для преобразования:

_data[i] = BitConverter.ToInt16(soundData[i : i + 2], 0) // Convert 2 bytes into an int and store at i

Таким образом, каждые два байта превращаются в Int16. Однако проблема в том, что это слишком медленно, так как для файла размером около 50 мегабайт это может занять 20 секунд!

Есть ли общий способ сделать это мгновенно, вместо того, чтобы вызывать эту функцию для каждых 2 байтов моего массива данных, чтобы она не была такой медленной? Желательно «безопасным» способом, чтобы не было небезопасного кода.


person Shammah    schedule 01.01.2013    source источник
comment
Быстрый? Мононуклеоз? mono-project.com/Interop_with_Native_Libraries   -  person paulsm4    schedule 02.01.2013
comment
Весь смысл потока состоит в том, чтобы обрабатывать данные во время их загрузки, а не сначала загружать их, а затем перебирать их. Является ли преобразование действительно узким местом? Не могли бы вы включить цикл в свой вопрос?   -  person Adam    schedule 02.01.2013


Ответы (2)


Если массив байтов находится в правильном Endian, просто выделите массив Int16 и используйте копию Buffer.Block (воздушный код):

byte[] b = new byte[]{1, 2, 3, 4};
short[] s = new short[2]; // 4 bytes long
Buffer.BlockCopy(b, 0, s, 0, 4);
person Kelly Ethridge    schedule 01.01.2013
comment
Порядок следования байтов был действительно правильным, и с помощью этого метода мои 50 МБ данные удалось преобразовать за 1,5 с вместо 15-20 с, что является значительным улучшением! - person Shammah; 02.01.2013

Без тестирования я не уверен, что правильно понимаю математику и "порядок байтов", но другим вариантом было бы попробовать что-то вроде этого:

// Convert 2 bytes into an int and store at i
_data[j] = (int)soundData[i] + (soundData[i + 1] << 8);

Если это также недостаточно быстро, вам может понадобиться другой подход к проблеме.

Некоторые другие идеи можно найти для вопроса: Convert Byte Array to Integer In ВБ.Нет

person Jonathan Wood    schedule 01.01.2013
comment
Вероятно, потребуется гипс перед переключением. - person kenny; 02.01.2013
comment
Добавлено, хотя я точно не уверен, в какой тип целого числа он преобразовывает. - person Jonathan Wood; 02.01.2013