设为首页 加入收藏

TOP

用C语言LZW编解码算法(三)
2014-04-06 17:40:45 来源: 作者: 【 】 浏览:373
Tags:语言 LZW 解码 算法

 

  //------------------------------------------------------------------------------

  #endif

  decode.h 解压函数主函数

  #ifndef __DECODE_H__

  #define __DECODE_H__

  //------------------------------------------------------------------------------

  #include

  #include

  #include

  //------------------------------------------------------------------------------

  VOID out_code( WORD code ,PBUFFER_DATA buffer,PLZW_DATA lzw,PSTACK_DATA stack)

  {

  WORD tmp;

  if( code < 0x100 )

  {

  stack->lp_stack[ stack->index++ ] = code;

  }

  else

  {

  stack->lp_stack[ stack->index++ ] = lzw->lp_suffix[ code ];

  tmp = lzw->lp_prefix[ code ];

  while( tmp > 0x100 )

  {

  stack->lp_stack[ stack->index++ ] = lzw->lp_suffix[ tmp ];

  tmp = lzw->lp_prefix[ tmp ];

  }

  stack->lp_stack[ stack->index++ ] = (BYTE)tmp;

  }

  while( stack->index )

  {

  if( buffer->index == BUFFERSIZE )

  {

  empty_buffer(lzw,buffer);

  }

  buffer->lp_buffer[ buffer->index++ ] = stack->lp_stack[ --stack->index ] ;

  }

  }

  //------------------------------------------------------------------------------

  VOID insert_2_table(PLZW_DATA lzw )

  {

  lzw->lp_code[ lzw->code ] = lzw->code;

  lzw->lp_prefix[ lzw->code ] = lzw->prefix;

  lzw->lp_suffix[ lzw->code ] = lzw->suffix;

  lzw->code++;

  if( lzw->code == ((WORD)1<cur_code_len)-1 )

  {

  lzw->cur_code_len++;

  if( lzw->cur_code_len == CODE_LEN+1 )

  lzw->cur_code_len = 9;

  }

  if(lzw->code >= 1<

  {

  re_init_lzw(lzw);

  }

  }

  //------------------------------------------------------------------------------

  WORD get_next_code( PBUFFER_DATA buffer , PLZW_DATA lzw )

  {

  BYTE next;

  WORD code;

  while( buffer->by_left < lzw->cur_code_len )

  {

  if( buffer->index == BUFFERSIZE )

  {

  load_buffer( lzw->h_sour, buffer );

  }

  next = buffer->lp_buffer[ buffer->index++ ];

  buffer->dw_buffer |= (DWORD)next << (24-buffer->by_left);

  buffer->by_left += 8;

  }

  code = buffer->dw_buffer >> ( 32 - lzw->cur_code_len );

  buffer->dw_buffer <<= lzw->cur_code_len;

  buffer->by_left -= lzw->cur_code_len;

  return code;

  }

  //------------------------------------------------------------------------------

  VOID do_decode( PBUFFER_DATA in, PBUFFER_DATA out, PLZW_DATA lzw, PSTACK_DATA stack)

  {

  WORD code;

  WORD tmp;

  while( in->index != in->top )

  {

  code = get_next_code( in ,lzw );

  if( code < 0x100 )

  {

  // code already in table

  // then simply output the code

  lzw->suffix = (BYTE)code;

  }

  else

  {

  if( code < lzw->code )

  {

  // code also in table

  // then output code chain

  tmp = lzw->lp_prefix[ code ];

  while( tmp > 0x100 )

  {

  tmp = lzw->lp_prefix[ tmp ];

  }

  lzw->suffix = (BYTE)tmp;

  }

  else

  {

  // code == lzw->code

  // code not in table

  // add code into table

  // and out put code

  tmp = lzw->prefix;

  while( tmp > 0x100 )

  {

  tmp = lzw->lp_prefix[ tmp ];

  }

  lzw->suffix = (BYTE)tmp;

  }

  }

  insert_2_table( lzw );

  out_code(code,out,lzw,stack);

  lzw->prefix = code;

  }

  }

  //------------------------------------------------------------------------------

  VOID decode( HANDLE h_sour, HANDLE h_dest )

  {

  LZW_DATA lzw;

  BUFFER_DATA in ;

  BUFFER_DATA out;

  STACK_DATA stack;

  BOOL first_run;

  first_run = TRUE;

  lzw_create( &lzw ,h_sour,h_dest );

  buffer_create( &in );

  buffer_create( &out );

  stack_create(&stack );

  while( load_buffer( h_sour, &in ) )

  {

  if( first_run )

  {

  lzw.prefix = get_next_code( &in, &lzw );

  lzw.suffix = lzw.prefix;

  out_code(lzw.prefix, &out, &lzw , &stack);

  first_run = FALSE;

  }

  do_decode(&in , &out, &lzw, &stack);

  }

  empty_buffer( &lzw,&out);

  lzw_destory( &lzw );

  buffer_destory( &in );

  buffer_destory( &out );

  stack_destory( &stack);

  }

  #endif

        

首页 上一页 1 2 3 4 5 下一页 尾页 3/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇数据结构实验叉树的建立 下一篇C++因子和阶乘

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: