📄 decompress.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 + -