@mmisin1
Студент

Как грамотно преобразовывать информацию из byte в int?

Здравствуйте. Пишу программу по обработке звука с микрофона. Данные сохраняются в массиве char. Один отчёт равен 16 бит. Посоветуйте, как грамотно преобразовывать эти данные в int, чтобы строить по ним график амплитуд.

Сами отчета с микрофона я получаю с помощью функции библиотеки bass.dll
rchan = BASS_RecordStart(FREQ,CHANS,0,&DuffRecording,0);  // rchan - канал записи

и её колбэка:
BOOL CALLBACK DuffRecording(HRECORD hangle, const void *buffer, DWORD lenght, void *user)
  {
  if((reclen % BUFSTEP) + lenght >= BUFSTEP)  // динамическое выделение памяти под поток
	recbuf = (char *)realloc(recbuf,((reclen + lenght) / BUFSTEP + 1) * BUFSTEP);
  memcpy(recbuf+reclen,buffer,lenght);  // recbuf - массив отчетов char, из которого мне необходимо извлечь и обработать данные
  reclen+=lenght;  // reclen - длина массива recbuf 
  return TRUE;
  }

Поток сохраняет отчёты с микрофона в массиве char recbuf. 2 байта - один отчет. С ними мне и нужно как-то работать.
  • Вопрос задан
  • 2800 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Капец насоветовали.
При условии, что endianness вашей машины такой же, как у данных, я бы делал так:

char *recbuf = ...; // <-- входные данные
int16_t *samples = (int16_t*)recbuf; // <-- они же, в виде знаковых 16-битных чисел.

Всё. Обращайтесь к samples.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
tsarevfs
@tsarevfs Куратор тега C++
C++ developer
Можно просто в цикле пробежаться:
std::vector<char> data = get_data();
std::vector<int> data2plot;
for (int i  = 0; i < data.size() / 2; ++i)
{
	int hi = data[2 * i];
	int lo = data[2 * i + 1];
	data2plot.push_back((hi << 8) | lo);
}
plot(data2plot);
Ответ написан
GavriKos
@GavriKos
Дык и стройте график в char, в чем проблема, зачем преобразовывать?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы