반응형
Reading a non-text file
(various file formats : http://en.wikipedia.org/wiki/List_of_file_formats)
1. file type
- regular file (type 1)
- 데이터를 포함하고 있는 파일
- text file
- ASCII 코드나 유니코드(Unicode)로 인코딩된 문자(character)들을 포함하고 있는 파일
- non-text file (binary file)
- non-characters를 포함
- directory file (type 2)
- 그 directory의 각 파일에 대한 정보가 들어 있는 파일
- link file (type 7)
- 다른 파일을 가르키는 파일
- device file (type 3, 4)
- 키보드, 프린터, 마우스 등 다른 기기를 나타내는 파일
- socket file (type 5)
- 네트워크 연결을 가르키는 파일
2. binary file
- binary file은 아래의 데이터를 포함한다.
- 소리 (wav, mp3, ..)
- 그림 (jpg, gif, ...)
- 명령 (exe, elf, ...)
- 압축된 데이터 (zip, gz, ...)
- 기타 등등
3. little endian, big endian
- Multi-byte data는 little endian이나 big endian 방식으로 저장된다.
- little endian: 높은 주소는 높은 바이트로, 낮은 주소는 낮은 바이트로 (high-high low-low)
- big endian: 높은 주소는 낮은 바이트로, 낮은 주소는 높은 바이트로 (high-low low-high)
4. WAV file format
wav file은 sound data를 포함한다.
WAV File Specification
출처 : https://ccrma.stanford.edu/courses/422-winter-2014/projects/WaveFormat/
The canonical WAVE format starts with the RIFF header:
(RIFF file types: WAV, AVI, RMI, …)
0 4 ChunkID Contains the letters "RIFF" in ASCII form
(0x52494646 big-endian form).
4 4 ChunkSize 36 + SubChunk2Size, or more precisely:
4 + (8 + SubChunk1Size) + (8 + SubChunk2Size)
This is the size of the rest of the chunk
following this number. This is the size of the
entire file in bytes minus 8 bytes for the
two fields not included in this count:
ChunkID and ChunkSize. Expressed in little-endian.
8 4 Format Contains the letters "WAVE"
(0x57415645 big-endian form).
The "WAVE" format consists of two subchunks: "fmt " and "data":
The "fmt " subchunk describes the sound data's format:
12 4 Subchunk1ID Contains the letters "fmt "
(0x666d7420 big-endian form).
16 4 Subchunk1Size 16 for PCM. This is the size of the
rest of the Subchunk which follows this number.
20 2 AudioFormat PCM = 1 (i.e. Linear quantization)
Values other than 1 indicate some
form of compression.
22 2 NumChannels Mono = 1, Stereo = 2, etc.
24 4 SampleRate 8000, 22050, 44100, etc.
28 4 ByteRate == SampleRate * NumChannels * BitsPerSample/8
32 2 BlockAlign == NumChannels * BitsPerSample/8
The number of bytes for one sample including
all channels.
34 2 BitsPerSample 8 bits = 8, 16 bits = 16, etc.
The "data" subchunk contains the size of the data and the actual sound:
36 4 Subchunk2ID Contains the letters "data"
(0x64617461 big-endian form).
40 4 Subchunk2Size == NumSamples * NumChannels * BitsPerSample/8
This is the number of bytes in the data.
You can also think of this as the size
of the rest of the subchunk following this
number.
44 * Data The actual sound data.
5. Reading a non-text file
- 4, 2, 1바이트의 binary data를 읽으려면 각각
int
,short
,char
자료형을 사용한다. - 텍스트 데이터에는 char array를 사용합니다.
실제 코드는 여기를 참조
char ChunkID[10]; // use char array for text data
int ChunkSize; // use "int" for 4 byte data
char Format[10];
........
short AudioFormat; // use "short" for 2 byte data
........
x=open("./f1.wav", ...........);
y=read(x, ChunkID, 4); // read first 4 bytes into ChunkID[]
ChunkID[y]=0; // to print as a string
y=read(x, &ChunkSize, 4); // read next 4 bytes and store at address &ChunkSize
y=read(x, Format, 4); // read "WAVE"
Format[y]=0;
.......
y=read(x, &AudioFormat, 2); // read next 2 bytes and store at address &AudioFormat
..........
printf("ChunkID:%s\n", ChunkID);
printf("ChunkSize:%d\n",ChunkSize);
printf("Format:%s\n",Format);
.......
printf("AudioFormat:%d\n", AudioFormat);
.......
6. Other file-related system functions
lseek
, fopen
, fprintf
, ....
int y;
y=lseek(x, 30, SEEK_SET); // move file pointer to 30. return 30
y=lseek(x, 30, SEEK_CUR); // move file pointer to current file pointer+30=60.
// return 60
y=lseek(x, 0, SEEK_END); // move file pointer to the end of file. return this
// file pointer
FILE *f2;
char buf[100];
..........
f2=fopen("./yy","w"); // open ./yy for writing
fprintf(f2,"%s",buf); // write the string in buf into f2
추가적인 예제 및 실습 문제들을 확인하고 싶으시면 아래 링크를 클릭해주세요 :)
반응형
'Development > Linux' 카테고리의 다른 글
[Linux] 시스템 호출 관련 프로세스 관리 - fork, exec, wait, getpid 등 (0) | 2022.04.17 |
---|---|
[Linux] C/C++ - Command line argument (명령행 인자) (0) | 2022.04.17 |
[Linux] 원격 파일 전송 (업로드/다운로드) (0) | 2022.04.17 |
[Linux] open, read, write - C/C++ 시스템 호출 (0) | 2022.04.17 |
[Linux] C / C++ 컴파일 및 실행 방법 (gcc, g++) (0) | 2022.04.17 |