实验三LZW编码.doc
文本预览下载声明
实验三 LZW编码
一、实验目的
1、加深对LZW编码的理解;
2、掌握LZW编码的程序设计。
二、原理与说明
LZW编码的步骤:
串表 a 1 aab 7 b 2 bc 8 c 3 cb 9 aa 4 baa 10 ab 5 aaba 11 ba 6 abb 12
a a b aa b c ba aab ab bc
1 1 2 4 2 3 6 7 5 8
三、
计算机
程序如下:#includestdio.h
#includeconio.h
#includemalloc.h
#includestring.h
#includeprocess.h
#define BIRS 12
#define HASHING_SHIFT BITS-8
#define MAX_VALUE(1BITS)-1
#define MAX_CODE MAX_VALUE-1
#if BITS==14
#define TABLE_SIZE 18041
#endif
#if BITS==13
#define TABLE_SIZE 9029
#endif
#if BITS=12
#define TABLE_SIZE 5021
int *code_value;
unsigned int *prefix_code;
unsigned char *append_character;
unsigned char decode_stack[4000];
char ok;
find match(int hash_perfix,unsigned int hash_character)
{
int index;
int offset;
index=(hash_characterHASHING_SHIFT)^hash_prefix;
if(index==0)
offset=1;
else
offset=TABLE_SIZE-index;
while(1)
{
if(code_value[index]==-1)
return(index);
if(prefix_code[index]==hash_prefixappend_character[index]==hash_character)
return(index);
index-=offset;
if(index0)
index+=TABLE_SIZE;
}
}
input_code(FILE*input)
{
unsigned int return_value;
static int input_bit_count=0;
static unsigned long input_bit_buffer=0L;
while(input_bit_count=24)
{
input_bit_buffer|=(unsigned long)getc(input)(24-input_bit_count);
input_bit_count+=8;
}
return_value=input_bit_buffer(32-BITS);
input_bit_buffer=BITS;
input_bit_count-=BITS;
return(return_value);
}
void output_code(FILE*output,unsigned int code)
{
static int output_bit_count=0;
static unsigned long output_bit_buffer=0L;
output_bit_buffer|=(unsigned long)code(32-BITS-output_bit_count);
output_bit_count+=BITS;
while(output_bit_count=8)
{
putc(output_bit_buffer24,output);
output_bit_buffer=8;
output_bit_count-=8;
}
}
void compress(FILE *input,FILE *output)
{
unsigned int next_code;
unsigned int character;
unsigned int string_code;
unsigned int index;
int i;
next_code=256;
for(i=0;iTABLE_SIZE;i++)
code_value[i]=-1;
i=0;
printf(\n\nCompressing..
显示全部