Nagłówek wav

0

Pewnego poranka ort! sie mi napisanie programu (w ramach nauki c++) odczytującego parametru pliku wav z jego nagłówka wykorzystałem do tego celu link http://www.yaotzin-steganografia.yoyo.pl/tekst/wavean/wavnag.htm . Do otwarcia pliku użyłem kodu:

#include <iostream>
#include <fstream>

using namespace std;

main ()
{
char *pc_Dane;
int i_DlugoscPliku, a;

fstream plik_odczyt;
plik_odczyt.open ("tekst.wav",ios::in|ios::binary);
plik_odczyt.seekg (0,ios::end);
i_DlugoscPliku = plik_odczyt.tellg();
pc_Dane = new char [i_DlugoscPliku + 1];
plik_odczyt.seekg (0, ios::beg);
plik_odczyt.read (pc_Dane, i_DlugoscPliku);
plik_odczyt.close ();

//pc_Dane [i_DlugoscPliku] = 0;

cout << i_DlugoscPliku << endl;

delete pc_Dane;
}

W zwiąku z tym mam pytanie w jaki sposób odczytać informacje o wielkości pliku zawartą w bajtach od 4 do 8 bajtu? Kiedy dane są podzielone na bajty. W jaki sposób je "scalić" by odczytać ich zawartość?
Obecnie chcę używać programu do odczytu danych z małych plików (bo obecnie cały plik wrzucam do ramu) w przyszłości będę wczytywał tylko nagłówek pliku.

0

np:

BYTE buf[] = {0x00, 0x00, 0x00, 0x01};
int number = ((int)buf[0]) << 24;    // nie wiem czy rzutowanie na int jest konieczne. Najprawdopodobniej nie.
number |= ((int)buf[1]) << 16;
number |= ((int)buf[2]) << 8;
number |= (int)buf[3];

// number ma teraz wartosc 0x00000001. 

Musisz jeszcze wiedzieć jak interpretować czytane dane, czyli czy tak jak w tym przypadku MSB był pierwszy zapisany - <url = http://pl.wikipedia.org/wiki/Kolejność_bajtów>Kolejność bajtów</url>

0

Obecnie chcę używać programu do odczytu danych z małych plików (bo obecnie cały plik wrzucam do ramu) w przyszłości będę wczytywał tylko nagłówek pliku.

Jeśli można coś zrobić od razu dobrze, to zrób to... w każdym razie spróbuj:

char chunkID[4];
unsigned int size;

if(!plik_odczyt.read(chunkID,4) || memcmp(chunkID,"RIFF",4) ||
	!plik_odczyt.seekg(4,ios::cur).read(chunkID,4) || memcmp(chunkID,"WAVE",4))
{
	// LIPA, to nie jest plik wav
}

while(plik_odczyt.read(chunkID,4).read((char*)&size,4))
{
	if(memcmp(chunkID,"fmt ",4) == 0)
	{
		/* tu czytasz 'size' bajtów zawartości bloku 'fmt ' */
		continue;
	}

	if(memcmp(chunkID,"data",4) == 0)
	{
		/* 
			--- tylko dla kodowania PCM ---
			
			czas_sek  = 'size' / (sample_rate * channels * bits/8)  
		*/
	}

	plik_odczyt.seekg(size,ios::cur);
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1