2013-01-01 2 views
4

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

Дело в том, что я хочу преобразовать все последовательные 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 байта моего массива данных таким образом, что это не так медленно? Предпочтительно «безопасным» способом, поэтому небезопасный код.

+0

"Fast"? "Моно"? http://www.mono-project.com/Interop_with_Native_Libraries – paulsm4

+3

Вся суть * потока * заключается в обработке данных при загрузке, а не в загрузке, а затем в повторении. Действительно ли конверсия является узким местом? Не могли бы вы включить цикл в свой вопрос? – Adam

ответ

4

Если массив байтов в правильном 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); 
+0

Конкретность была действительно правильной, и, используя этот метод, мои 50 МБ данные смогли преобразоваться в 1,5 с вместо 15-20 с, что является резким улучшением! – Shammah

3

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

// 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 VB.Net

+0

Наверное, понадобится бросок перед сменой. – kenny

+0

Добавлено, хотя я не уверен, какой тип целого он конвертирует. –