设为首页 加入收藏

TOP

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

  代码中加入了自己的一些注释,以便于阅读理解。

  程序由五个模块组成

  lzw.h 定义了一些基本的数据结构,常量,还有变量的初始化等。

  #ifndef __LZW_H__

  #define __LZW_H__

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

  #include

  #include

  #include

  #include

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

  #define LZW_BASE 0x102// The code base

  #define CODE_LEN 12 // Max code length

  #define TABLE_LEN 4099 // It must be prime number and bigger than 2^CODE_LEN=4096.

  // Such as 5051 is also ok.

  #define BUFFERSIZE 1024

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

  typedef struct

  {

  HANDLE h_sour; // Source file handle.

  HANDLE h_dest; // Destination file handle.

  HANDLE h_suffix; // Suffix table handle.

  HANDLE h_prefix; // Prefix table handle.

  HANDLE h_code; // Code table handle.

  LPWORD lp_prefix; // Prefix table head pointer.

  LPBYTE lp_suffix; // Suffix table head pointer.

  LPWORD lp_code; // Code table head pointer.

  WORD code;

  WORD prefix;

  BYTE suffix;

  BYTE cur_code_len; // Current code length.[ used in Dynamic-Code-Length mode ]

  }LZW_DATA,*PLZW_DATA;

  typedef struct

  {

  WORD top; // size of buffer

  WORD index; // index of data

  LPBYTE lp_buffer; //data of buffer

  HANDLE h_buffer; //handle of buffer

  BYTE by_left; //left bit of dw_buffer

  DWORD dw_buffer; //encoded data

  BOOL end_flag;

  }BUFFER_DATA,*PBUFFER_DATA;

  typedef struct //Stack used in decode

  {

  WORD index;

  HANDLE h_stack;

  LPBYTE lp_stack;

  }STACK_DATA,*PSTACK_DATA;

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

  VOID stack_create( PSTACK_DATA stack )

  {

  stack->h_stack = GlobalAlloc( GHND , TABLE_LEN*sizeof(BYTE) );

  stack->lp_stack = GlobalLock( stack->h_stack );

  stack->index = 0;

  }

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

  VOID stack_destory( PSTACK_DATA stack )

  {

  GlobalUnlock( stack->h_stack );

  GlobalFree ( stack->h_stack );

  }

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

  VOID buffer_create( PBUFFER_DATA buffer )

  {

  buffer->h_buffer = GlobalAlloc( GHND, BUFFERSIZE*sizeof(BYTE) );

  buffer->lp_buffer = GlobalLock( buffer->h_buffer );

  buffer->top = 0;

  buffer->index = 0;

  buffer->by_left = 0;

  buffer->dw_buffer = 0;

  buffer->end_flag = FALSE;

  }

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

  VOID buffer_destory( PBUFFER_DATA buffer )

  {

  GlobalUnlock( buffer->h_buffer );

  GlobalFree ( buffer->h_buffer );

  }

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

  VOID re_init_lzw( PLZW_DATA lzw ) //When code table reached its top it should

  { //be reinitialized.

  memset( lzw->lp_code, 0xFFFF, TABLE_LEN*sizeof(WORD) );

  lzw->code = LZW_BASE;

  lzw->cur_code_len = 9;

  }

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

  VOID lzw_create(PLZW_DATA lzw, HANDLE h_sour, HANDLE h_dest)

  {

  WORD i;

  lzw->h_code = GlobalAlloc( GHND, TABLE_LEN*sizeof(WORD) );

  lzw->h_prefix = GlobalAlloc( GHND, TABLE_LEN*sizeof(WORD) );

  lzw->h_suffix = GlobalAlloc( GHND, TABLE_LEN*sizeof(BYTE) );

  lzw->lp_code = GlobalLock( lzw->h_code );

  lzw->lp_prefix = GlobalLock( lzw->h_prefix );

  lzw->lp_suffix = GlobalLock( lzw->h_suffix );

  lzw->code = LZW_BASE;

  lzw->cur_code_len = 9;

  lzw->h_sour = h_sour;

  lzw->h_dest = h_dest;

  memset( lzw->lp_code, 0xFFFF, TABLE_LEN*sizeof(WORD) );

  }

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

  VOID lzw_destory(PLZW_DATA lzw)

  {

  GlobalUnlock( lzw->h_code );

  GlobalUnlock( lzw->h_prefix );

  GlobalUnlock( lzw->h_suffix );

  GlobalFree( lzw->h_code );

  GlobalFree( lzw->h_prefix );

  GlobalFree( lzw->h_suffix );

  }

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

  #endif

  fileio.h 定义了一些文件操作

  #ifndef __FILEIO_H__

  #define __FILEIO_H__

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

  #include

  #include

  #include

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

  HANDLE file_handle(CHAR* file_name)

  {

  HANDLE h_file;

  h_file = CreateFile(file_name,

  GENERIC_READ|GENERIC_WRITE,

  FILE_SHARE_READ|FILE_SHARE_WRITE,

  NULL,

  OPEN_ALWAYS,

  0,

  NULL

  );

  return h_file;

  }

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

  WORD load_buffer(HANDLE h_sour, PBUFFER_DATA buffer) // Load file to buffer

  {

  DWORD ret;

  ReadFile(h_sour,buffer->lp_buffer,BUFFERSIZE,&ret,NULL);

  buffer->index = 0;

  buffer->top = (WORD)ret;

  return (WORD)ret;

  }

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

  WORD empty_buffer( PLZW_DATA lzw, PBUFFER_DATA buffer)// Output buffer to file

  {

  DWORD ret;

  if(buffer->end_flag) // The flag mark the end of decode

  {

  if( buffer->by_left )

  {

  buffer->lp_buffer[ buffer->index++ ] = (BYTE)( buffer->dw_buffer >> 32-buffer->by_left )<<(8-buffer->by_left);

  }

  }

  WriteFile(lzw->h_dest, buffer->lp_buffer,buffer->index,&ret,NULL);

  buffer->index = 0;

  buffer->top = ret;

  return (WORD)ret;

  }

     

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

评论

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