新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > LZW压缩类实现无损压缩比居然到了可耻的4:1

LZW压缩类实现无损压缩比居然到了可耻的4:1

作者: 时间:2016-12-01 来源:网络 收藏

//保存最后的输入符号
oldcode=incode;
//返回符号扩展后的第一个字节
return firstcode;

}//华丽的分割线--------------------------------------------------------
void CLZW::flush_packet()
//清空所有积累的数据
{
if(bytesinpkt>0)
{
//所写入的长度必须大于0
packetbuf[0]=(char)bytesinpkt++;
if(fwrite(packetbuf,1,bytesinpkt,outfile)!=(size_t)bytesinpkt) printf("文件写入错误!");
bytesinpkt=0;
}

}

//华丽的分割线--------------------------------------------------------
void CLZW::CHAR_OUT(int c)
//向缓冲区增加一个字节同时在有必要时向磁盘写数据
{
packetbuf[++bytesinpkt]=(char)(c);
if(bytesinpkt>=255) flush_packet();
}

//华丽的分割线--------------------------------------------------------
//发送一个n_bits比特的代码并重组一个8为的字节
void CLZW::output(code_int code)
{
cur_accum|=((INT32)code)<cur_bits+=n_bits;
while(cur_bits>=8)
{
CHAR_OUT(cur_accum&0xFF);
cur_accum>>=8;
cur_bits-=8;
}
//如果下一个输入比最大的代码大则增加它
if(free_code>maxcode)
{
n_bits++;
if(n_bits==MAX_LZW_BITS) maxcode=LZW_TABLE_SIZE;else maxcode=MAXCODE(n_bits);
}
}

//华丽的分割线--------------------------------------------------------
void CLZW::clear_hash()
//清空hash表
{
memset((void*)hash_code,0,HSIZE*sizeof(code_int));
}

//华丽的分割线--------------------------------------------------------
void CLZW::clear_block()
//重置压缩并发送一个清除码
{
clear_hash();
free_code=ClearCode+2;
output(ClearCode);
n_bits=init_bits;
maxcode=MAXCODE(n_bits);
}

//华丽的分割线--------------------------------------------------------
void CLZW::compress_init(FILE* file,int ibits)
//初始化LZW压缩
{
//初始化所有静态变量给hash表分配内存
hash_code=(code_int*)malloc(HSIZE*sizeof(code_int));
hash_prefix=(code_int*)malloc(HSIZE*sizeof(code_int));
hash_suffix=(UINT_8*)malloc(HSIZE*sizeof(UINT_8));

outfile=file;
n_bits=init_bits=ibits;

maxcode=MAXCODE(n_bits);
ClearCode=((code_int)1<<(init_bits-1));
EOFCode=ClearCode+1;
free_code=ClearCode+2;
first_byte=true;

//初始化缓冲区变量
bytesinpkt=0;
cur_accum=0;
cur_bits=0;
//清理hash表
clear_hash();
//给定一个初始清理字符
output(ClearCode);
}

//华丽的分割线--------------------------------------------------------
void CLZW::compress_byte(int c)
//得到和压缩一个8位的字节
{
register hash_int i;
register hash_int disp;

if(first_byte)
{
//初始化一个等待码
waiting_code=c;
first_byte=false;
return;
}

i=((hash_int)c<<(MAX_LZW_BITS-8))+waiting_code;

if(i>=HSIZE) i-=HSIZE;

if(hash_code[i]!=0)
{
if(hash_prefix[i]==waiting_code&&hash_suffix[i]==(UINT_8)c)
{
waiting_code=hash_code[i];
return;
}

if(i==0) disp=1; else disp=HSIZE-i;

while(1)
{
i-=disp;
if(i<0) i+=HSIZE;
if(hash_code[i]==0) break;
if(hash_prefix[i]==waiting_code&&hash_suffix[i]==(UINT_8)c)
{
waiting_code=hash_code[i];
return;
}
}
}

//如果期望的符号不在表中
output(waiting_code);
if(free_code{
//在hash表里增加一个符号
hash_code[i]=free_code++;
hash_prefix[i]=waiting_code;
hash_suffix[i]=(UINT_8)c;
}else clear_block();
waiting_code=c;
}

//华丽的分割线--------------------------------------------------------
void CLZW::compress_term()
//结尾保存
{
//保存缓冲区里的代码
if(!first_byte) output(waiting_code);
//发送一个结束代码
output(EOFCode);
if(cur_bits>0)
{
CHAR_OUT(cur_accum&0xFF);
}
//保存缓冲区里的代码
flush_packet();
}


上一页 1 2 下一页

评论


技术专区

关闭