Форум программистов, компьютерный форум CyberForum.ru

Чтение 16-и битных слов из бинарника (загрузка Wav) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
FarStar
Заблокирован
27.03.2013, 12:56     Чтение 16-и битных слов из бинарника (загрузка Wav) #1
Привет! Загружаю WAV. Данные в файле для формата звуковых данных с дискретностью 16 бит монофонического сигнала хранятся в массиве 16-битовых слов.
Вот читаю я заголовок файла,
C++
1
2
std::fstream fs("1.wav",std::ios::in | std::ios::binary);  
 fs.read((char*)&wav,sizeof(WaveHeader));
А дальше как быть? Если последовательность данных там в 16-и битных словах, как записать команду read хотя бы для первого слова , чтоб данные оказывались в int в итоге?

Добавлено через 16 минут
Тоесть есть поле в хэдере wav - wav.ID_SIZE_DATA. В 16-и битном формате оно всё равно содержит кол-во байт, тоесть кол-во чаров и если я пытаюсь загрузить так (типа в int два char), всё равно получается лажа на выходе.
C++
1
2
3
int *buf=new int[wav.ID_SIZE_DATA/2];
  for(int i=0;i<wav.ID_SIZE_DATA/2;i++)
      fs.read((char*)buf,sizeof(int));
Добавлено через 4 минуты
Точнее сам напутал, в int не два чара, по крайней мере в 32-х битной oc.
В short - точно два байта, тоесть два char. Думаю вопрос сводится к чтению двух байт, тоесть двух char, и объединения их в один short. Вот как бы это сделать? Тоесть есть у меня два переменных типа char, и из них надо получить один short, ну и наверное, первый char - старшие 8 бит, а второй - младшие. Тоесть как объединить это два char в один short, не прибегая к ассемблеру, ибо на регистрах это сделать легко

Добавлено через 4 минуты
В общем битовые операции спасут мир, на этом же форуме нашёл :-)
C++
1
2
3
4
5
6
7
8
9
 byte y = 5, x = 4;
            short z;
 
            z = x;
 
            int tmp = z;
            tmp = tmp << 8;
            z = (short)tmp;
            z = (short)(z | y);
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.03.2013, 12:56     Чтение 16-и битных слов из бинарника (загрузка Wav)
Посмотрите здесь:

Запись/чтение нуля из бинарника C++
C++ Чтение бинарника по биту
Считывание 32-х битных слов из файла C++
C++ Чтение самплов из wav файла в массив
Как объединить пару байт в слово? (Загрузка WAV, Big Endian) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Friday
ну и долго меня небыло...
 Аватар для Friday
61 / 57 / 8
Регистрация: 24.03.2013
Сообщений: 173
27.03.2013, 13:01     Чтение 16-и битных слов из бинарника (загрузка Wav) #2
молодец! сам нашел решение!
если нужны примеры програм с побитовыми операциями - обращайся, у меня есть пару)
FarStar
Заблокирован
27.03.2013, 13:07  [ТС]     Чтение 16-и битных слов из бинарника (загрузка Wav) #3
Цитата Сообщение от Friday Посмотреть сообщение
если нужны примеры програм с побитовыми операциями - обращайся, у меня есть пару)
Да я в принципе знал как это делается, просто чё то недавно наушники снял (играл GOA-TRACE) И не сразу врубился, что надо именно так :-))

Теперь думаю, как мне эти числа отправить на звуковую карту для воспроизведения, если будет всё ок, займусь уже главной задачей - преобразованием этих чисел определённым нужным мне образом, перед воспроизведением
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
27.03.2013, 13:17     Чтение 16-и битных слов из бинарника (загрузка Wav) #4
Файл это последовательность байтов, то есть 8-битных слов. Хранить 16-битовое число в файле можно двумя способами: сначала идет младший байт числа, потом старший либо наоборот. Вы должны сначала выяснить, с каким случаем вы имеете дело, а потом думать как прочитать это число в переменную int.
Если иметь в виду, что int занимает 4 байта и первым байтом идут младшие байты числа, то для первого случая читать можно так:
C++
1
2
n=0
fs.read((char*)&n, 2);
Для второго случая читать можно так:
C++
1
2
3
4
n=0
fs.read((char*)&n, 1);
n <<= 8;
fs.read((char*)&n, 1);
Если вместо int n вы используете short n, то есть n занимает два байта, то оператор n=0 в обоих случаях можно опустить.
Yandex
Объявления
27.03.2013, 13:17     Чтение 16-и битных слов из бинарника (загрузка Wav)
Ответ Создать тему
Опции темы

Текущее время: 21:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru