System Programming - file(2)
file type : regular file(우리가 알고있는 것), directory file(디렉토리 정보를 담고 있는 파일), link file(윈도우에서 바로가기 파일 말그대로 링크), device file(디바이스를 나타내는 파일, 마우스나 키보드), socket file(네트워크 커넥션을 가리키는 파일), etc...
non-text file(binary file): non-ascii data (text파일이 아님. char가 없음)
ex) sound file(wav, mp3...), picture(gif, jpg, mpeg....), program(exe, elf....)
text file을 읽을 때는 cat, vi, xxd를 썼었다. binary file은 어떨까? 일단 cat와 vi는 쓰지 못한다. xxd로는 볼 수는 있다. 근데 무슨 데이터가 무슨 말을 하는지 알 수가 없다. file의 format을 알아야한다. (wav file: wav format, mpeg file: mpeg format, word file: word format)
Little endian, Big endian: 숫자를 집어넣는 방식. (*참고 16진수는 2자리가 1byte) 예를 들어 short x=7 -> x=0x0007인데 위에서부터 07을 먼저넣고 그 다음 00을 넣는 방식이 Little endian, 앞에서부터 순서대로 00, 07순서로 넣는 것이 Big endian이다. (넣는 방식이 햇갈릴 수 있는데 stack구조에 넣는다고 보면된다. 참고로 컴퓨터는 대부분 Little endian방식을 쓴다.)
이번에는 WAV file을 알아보자.
WAV file은 RIFF file formats의 일종이다. 그 중에서 WAV file은 sound를 저장함.
WAV file = RIFF header + subchunk1 + subchunk2 // subchunk안에는 소리에 관한 정보가 담겨있음. sampling parameter같은 것이 담겨있음, 2에는 actual sound data가 담겨있음.
file을 보면 text 정보도 있고 non-text도 있는데 char array같은 경우에는 Big endian, number의 경우에는 little-endian으로 저장된다.
RIFF header: 12byte인데 첫 4byte는 글자가 들어있다. RIFF format이라는 것을 의미하는 "RIFF"가 들어있다. 그 다음 4byte는 ChunkSize가 들어있는데 Chunk다음부터의 전체 사이즈를 알려주고 little endian form으로 저장되어 있다. 마지막 4byte는 문자열인데 "WAVE"가 들어있어 이것이 WAV file임을 알려주는 글자가 들어있다.
subchunk1: 여러가지 sound sampling parameter 정보가 들어있음.
위에서부터 설명하면
1."fmt "가 들어있다.
2. subchunk1size가 들어있다. 아까와 같이 subchunksize그 다음부터의 size를 말한다.
3. audioformat은 1이면 압축이 되어있다. 1이 아니라면 압축이 안돼 있다는 것을 알려준다. (여기서는 1)
4. channel의 개수 (Mono = 1, Stereo = 2)
5. 초당 샘플링을 몇번이나 했는가? (8000, 44100)
6. 초당 몇 Byte냐 (sample당 몇 byte?) (SampleRate * NumChannels * BitsPerSample/8)
7. 그 다음은 channel 개수까지 고려한 샘플의 개수 (NumChannels * BitsPerSample)
8. 샘플당 비트 수. (8 bits = 8, 16 bits = 16)
subchunk2에는 앞서 말했듯이 실제 데이터가 포함되어 있다.
1. "data"의 4byte가 들어있음.
2. subchunk2size의 4byte가 들어있음
3. 나머지는 실제 data가 들어있다. (용량은 그에 따라 다름.)