⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 decompress.c

📁 LZW的简单算法。主要能够进行简单的示例
💻 C
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_CODES 4096
#define BOOL int
#define TRUE 1
#define FALSE 0

void decompress(void);
int get_code(void);
void output(int pcode);
void print_binary(int i);
void set_files(char *filename);

typedef struct{
    int prefix;
    int suffix;
}Element;

const int BYTE_SIZE = 8;
const int EXCESS = 4;
const int ALPHA= 256;
const int MASK = 15;

int s[MAX_CODES];
int size;
Element h[MAX_CODES];
int leftOver;
BOOL bitsLeftOver = FALSE;
FILE *in, *out;

void decompress(){
    int codeUsed = ALPHA;
    int pcode = get_code(), ccode;
    if(pcode>=0){
        s[0] = pcode;
        fputc(s[0], out);
        size = 0;

        do{
            ccode = get_code();
            if(ccode<0)break;
                if(ccode<codeUsed){
                    output(ccode);
                    if(codeUsed<MAX_CODES){
                        h[codeUsed].prefix = pcode;
                        h[codeUsed].suffix = s[size];
                        codeUsed++;
                    }
                }
                else{
                    h[codeUsed].prefix = pcode;
                    h[codeUsed].suffix = s[size];
                    codeUsed++;
                    output(ccode);
                }
                pcode = ccode;
        }while(TRUE);   /*DO*/
    }/*IF*/
    fclose(in);
    fclose(out);
}

int get_code(){
    int c = fgetc(in), d, code;
    if(c == -1)return -1;

    if(bitsLeftOver)
        code = (leftOver<<BYTE_SIZE)+c;
    else{
        d = fgetc(in);
        code = (c<<EXCESS)+(d>>EXCESS);
        leftOver = d&MASK;
    }
    bitsLeftOver = !bitsLeftOver;
    return code;
}

void output(int code){
    int i;
    size = -1;
    while(code>=ALPHA){
        s[++size]=h[code].suffix;
        code = h[code].prefix;
    }
    s[++size]=code;
    for(i=size; i>=0; i--)
        fputc(s[i], out);
}

//for debug used
void print_binary(int i){
    int j;
    for(j=7; j>=0; j--)
        printf("%i", (i>>j)&1);
    printf("\n");
}

void set_files(char *filename){
    char *s;
    if( (in = fopen(filename, "rb")) == NULL){
        printf("Cannot open input file - %s\n", filename);
        exit(1);
	}
    if(strstr(filename, ".zzz")==NULL){
        printf("The filename must end with \"zzz\" extension");
        exit(1);
    }
    s = filename;
    s = s+(strlen(filename)-4)*sizeof(char);
    *s = NULL;  //seperate from ".zzz"
    if ((out = fopen(filename, "wb"))== NULL){
        printf("Cannot open output file - %s\n", filename);
        fclose(in);
        exit(1);
    }
}

int main(int argc, char* argv[]){
    if(argc<2){
        printf("Usage:decompress <filename>\n");
        return(1);
    }
    set_files(argv[1]);
    decompress();
    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -