1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
 
long file_length(char filename[]);        //파일의 길이 구하는 함수
int RLECompression(FILE *src, char *srcname);    //RLE방법을 이용한 압축
int RLEDecompression(FILE *src);    //RLE방법을 이용한 압축해제
 
/*    main
    o_filename : 압축할 파일이름, c_filename : 압축된 파일이름
    압축할 파일을 RLECompression 함수를 이용하여 압축하여 text.rle로 압축
    text.rle파일을 RLEDecompression함수를 이용하여 압축풀기
    src, decomp_src : 압축을 하고, 풀기위한 파일 포인터
    o_filesize, c_filesize : 소스파일과, 압축파일의 크기
*/
int RLUnComp(FILE *src, FILE *dst)
{
       long header=0;                // 헤더를 저장한다.
       long len;                // 압축을 해제했을 때의 데이터 크기
       long count=0;                // 압축을 얼마나 해제했는가
 
       int i;
       int flag_byte;                // flag_byte
       int data_byte;                // data_byte
 
       for(i=0;i<4;i++) {
               header|=((fgetc(src))<<(8*i));        // 뒤에서부터 4바이트를 읽는다
       }
 
       if((header&0xff)!=0x30) {
               printf("This is not an RLE data\n");
               return -1;
       }
 
       printf("This is compressed with RLE\n");
 
       len=header>>8;                // 뒤의 한 바이트는 잘라낸다
 
       while(count<len) {
               flag_byte=fgetc(src);                // flag_byte를 읽고
               if(flag_byte&0x80) {                // 압축 데이터라면
                       data_byte=fgetc(src);        // data_byte를 읽어
                       for(i=0;i<(flag_byte&0x7f)+3;i++) {
                               fputc(data_byte,dst);
                               count++;        // (flag_byte&0x7f)+3 만큼 반복한다.
                       }
               }
               else {                                        // 압축되지 않은 데이터라면
                       for(i=0;i<(flag_byte&0x7f)+1;i++) {
                               data_byte=fgetc(src);
                               fputc(data_byte,dst);        // (flag_byte&0x7f)+1 만큼의
                               count++;                // data_byte를 그대로 출력한다.
                       }
               }
 
       }
       return 0;
}
cs