亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? lzw算法源碼c語言.c

?? LZW壓縮算法簡介 作者:宋成 描述:一篇關于LZW壓縮算法簡介的文章
?? C
?? 第 1 頁 / 共 2 頁
字號:
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <conio.h>
#include <windows.h>

//#define _DISPLAY_DBGINFO_
#define INLINE __inline

#ifdef _DISPLAY_DBGINFO_
#define DBG_PRINT(ARGS) printf##ARGS
#else
#define DBG_PRINT(ARGS)
#endif

typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned long u32;

extern "C" void WINAPI write_code(void);
extern "C" u32 WINAPI read_code(void);


//#define _USE_ASM_VER__WRITE_DATA_TO_BS
//#define _USE_ASM_VER__MEMCMP

//#define _USE_ASM_VER__LZW_COMPRESS
//#define _USE_ASM_VER__LZW_DECOMPRESS


#define CODE_LENGTH  (11)
#define MAX_CB_ONECE (1<<CODE_LENGTH) /*  The maxinum bytes to compress at one time */
#define MAX_ST_ENTRIES MAX_CB_ONECE
#define MAXIMUM_CODE (MAX_CB_ONECE-1)
#define MAX_STR_NUM  (0x10000)

#pragma pack(1)

typedef struct
{
 u16 start_pos;
 u16 str_len;
} string_t;

typedef struct _st_entry_t
{
 string_t the_string;
 struct _st_entry_t *next;
} st_entry_t;

typedef struct
{
 string_t the_string;
} tt_entry_t;

typedef struct
{
 string_t the_string;
 long character;
} translated_string_t;

typedef struct
{
 u32 code_num : 31;
 u32 data_compressed : 1;
} lzw_info_t;

#pragma pack()

enum
{
 RCOK_DATA_COM = 1, // Data are compressed
 RCOK_DATA_UNC = 2,  /*++
  Data are not compressed,
  just copied  directly from source buffer to destination buffer.
      ++*/
 RCFAILED = -1, // Data compression fails due to some reasons.
};

/*+++
// Data area
==*/
static union
{
 st_entry_t lzw_string_table_entries[MAX_ST_ENTRIES];
 tt_entry_t lzw_translation_table_entries[MAX_ST_ENTRIES];
};

static union
{
 st_entry_t *lzw_string_table[MAX_STR_NUM];
};

#ifdef _USE_ASM_VER__MEMCMP
extern "C" int WINAPI CompareMemory(void *s, void *d, int size);
#else
#define CompareMemory memcmp
#endif

void set_bit(u8 *bit_stream, const u32 offset_in_bits)
{
 u32 offset_in_bytes, offset_within_byte;

 offset_in_bytes = offset_in_bits >> 3;
 offset_within_byte = offset_in_bits & 7;

 *(bit_stream+offset_in_bytes) |= (1<<offset_within_byte);
}

void clear_bit(u8 *bit_stream,
 const u32 offset_in_bits)
{
 u32 offset_in_bytes, offset_within_byte;

 offset_in_bytes = offset_in_bits >> 3 ;
 offset_within_byte = offset_in_bits & 7;

 *(bit_stream+offset_in_bytes) &= (~(1<<offset_within_byte));
}

int read_bit(u8 *bit_stream, const u32 offset_in_bits)
{
 u32 offset_in_bytes;
 u32 offset_within_byte;

 offset_in_bytes = offset_in_bits >> 3 ;
 offset_within_byte = offset_in_bits & 7;

 return ( ( *(u32 *) (bit_stream+offset_in_bytes) )
  >> offset_within_byte ) & 1;
}


void write_data_to_bs(u32 *data, int bits_of_data,
 u8 *bit_stream, u32 &bit_offset)
{

#ifdef _USE_ASM_VER__WRITE_DATA_TO_BS

 __asm
 {
  push esi
   push ebx

   mov esi, data
   mov eax, [esi]
   mov esi, bit_stream
   mov ebx, bit_offset
   mov ebx, [ebx]

   call write_code

   mov esi, bit_offset
   add dword ptr [esi], CODE_LENGTH

   pop ebx
   pop esi
 }
#else

 int i;
 int n;

 u32 _bit_offset = bit_offset, _bits_of_data = bits_of_data;

 while( bits_of_data > 0 )
 {
  n = bits_of_data > 32 ? 32 : bits_of_data;

  for(i=0; i<n; i++)
  {
   if( ( ( *data ) >> i) & 1 )
   {
    set_bit(bit_stream, bit_offset);
   }
   else
   {
    clear_bit(bit_stream, bit_offset);
   }

   bit_offset++;
  }

  data ++;
  bits_of_data -= n;

  if( bits_of_data )
  {
   assert(0);
  }
 }

 assert( bit_offset - _bit_offset == _bits_of_data);

#endif

}

void write_char_to_bs(const u8 data, u8 *bit_stream,
 u32 &bit_offset)
{
 u32 data_buff = data;

 write_data_to_bs(&data_buff, 8, bit_stream, bit_offset);
}

void write_short_to_bs(const u16 data, u8 *bit_stream,
 u32 &bit_offset)
{
 u32 data_buff = data;

 write_data_to_bs(&data_buff, 16, bit_stream, bit_offset);
}


void read_data_from_bs(void *data, int bits_of_data,
  u8 *bit_stream, u32 &bit_offset)
{

#ifdef _USE_ASM_VER__WRITE_DATA_TO_BS

 __asm
 {
  push esi
   push ebx

   mov esi, bit_stream
   mov ebx, bit_offset
   mov ebx, [ebx]

   call read_code

   mov esi, data
   mov [esi], eax

   mov esi, [bit_offset]
   add dword ptr [esi], CODE_LENGTH

   pop ebx
   pop esi
 }

#else

 int i;
 int n;

 while( bits_of_data > 0 )
 {
  n = bits_of_data > 8 ? 8 : bits_of_data;
  *(u8 *)data = 0;

  for(i=0; i<n; i++)
  {
   if( read_bit(bit_stream, bit_offset) )
   {
    ( *(u8 *)data ) |= (1<<i);
   }

   bit_offset++;
  }

  data = ( (u8 *)data ) + 1;
  bits_of_data -= n;
 }

#endif

}

u8 read_char_from_bs(u8 *bit_stream, u32 &bit_offset)
{
 u8 data;
 read_data_from_bs(&data, 8, bit_stream, bit_offset);

 return data;
}

u16 read_short_from_bs(u8 *bit_stream, u32 &bit_offset)
{
 u16 data;
 read_data_from_bs( (u8 *) &data, 16, bit_stream, bit_offset);

 return data;
}


int search_string_table(u8 *data_buff, int string_num,
 st_entry_t **string_table, string_t *cur_str, st_entry_t **matched_entry=NULL)
{

 int length = cur_str->str_len + 1;

 u16 index = *(u16 *) (data_buff + cur_str->start_pos);
 st_entry_t *next_entry = string_table[index];

 *matched_entry = NULL;

 while( next_entry )
 {
  if( length == next_entry->the_string.str_len  &&
   CompareMemory(data_buff + next_entry->the_string.start_pos,
    data_buff + cur_str->start_pos, length) == 0 )
  {
   if( matched_entry )
   {
    *matched_entry = next_entry;
   }
   return (int)index;
  }

  next_entry = next_entry->next;
 }

 return -1;
}

void addto_string_table(u8 *data_buff,
 int &string_num, st_entry_t **string_table, st_entry_t *st_entries,
 string_t *cur_str)
{
 u16 index = *(u16 *) (data_buff + cur_str->start_pos);

 st_entries[string_num].the_string = (*cur_str);
 st_entries[string_num].next = NULL;
 st_entry_t *pre_entry = string_table[index];

 if( pre_entry )
 {
  while( pre_entry->next )
  {
   pre_entry = pre_entry->next;
  }

  pre_entry->next = &st_entries[string_num];
 }
 else
 {
  string_table[index] = &st_entries[string_num];
 }

 string_num++;

}

void output_code(u16 code, u8 *out_data_buffer,
  u32 &bit_offset)
{
 write_data_to_bs(
  (u32 *)&code, CODE_LENGTH, out_data_buffer,  bit_offset);
}

#ifdef _USE_ASM_VER__LZW_COMPRESS

extern "C" int WINAPI lzw_compress(st_entry_t **string_table, st_entry_t *st_entries,
 u8 *in_data_buffer, int in_data_len,
 u8 *out_data_buffer, u32 *out_data_len);

#else

int lzw_compress(st_entry_t **string_table, st_entry_t *st_entries,
 u8 *in_data_buffer, int in_data_len,
 u8 *out_data_buffer, u32 *out_data_len)
{
 int ret_val = RCFAILED;

 int string_num;

 string_t cur_string; // string table entry
 st_entry_t *matched_entry;

 int cur_pos;
 u32 bit_offset;

 st_entry_t **tmp_ptr1=NULL, *tmp_ptr2=NULL;

 if( in_data_len > MAX_CB_ONECE )
 {
  goto err_out;
 }

 if( !string_table )
 {
  tmp_ptr1 = new st_entry_t *[MAX_ST_ENTRIES];
  if( !tmp_ptr1 )
  {
   goto err_out;
  }
  string_table = tmp_ptr1;
 }

 if( !st_entries )
 {
  tmp_ptr2 = new st_entry_t[MAX_ST_ENTRIES];
  if( !tmp_ptr2 )
  {
   goto err_out;
  }
  st_entries = tmp_ptr2;
 }

 memset(string_table, 0, sizeof(st_entry_t *) * MAX_STR_NUM);
 memset(st_entries, 0, sizeof(st_entry_t) * MAX_ST_ENTRIES);

 int cnt1, cnt2;
 u32 total_string_length;


 string_num = 0;
 bit_offset = 0;
 cur_string.start_pos = 0;
 cur_string.str_len = 1;
 cur_pos = 1;
 matched_entry = NULL;

 cnt1=0; cnt2=0; total_string_length=0;
 while( 1/*cur_pos < in_data_len*/ )
 {
  st_entry_t *tmp_matched_entry;

  if( cur_pos==2047 )
  {
   cur_pos = cur_pos;
  }

  if( string_num + 256 >= MAXIMUM_CODE ||
   bit_offset >= (u32)in_data_len * CODE_LENGTH )
  {
   memcpy(out_data_buffer, in_data_buffer, in_data_len);
   *out_data_len = in_data_len;
   ret_val = RCOK_DATA_UNC;
   goto cprs_fail;
  }

  if( cur_pos < in_data_len &&
   search_string_table(in_data_buffer, string_num,
    string_table, &cur_string, &tmp_matched_entry) >= 0 )
  {
   cur_string.str_len ++ ;

   matched_entry = tmp_matched_entry;
  }
  else
  {
   u16 code;

   if( matched_entry )
   {
    code = 256 + (u16) (matched_entry - st_entries);

    //matched_entry = NULL;

    cnt1++;
    total_string_length+=cur_string.str_len;

    matched_entry = NULL;
   }
   else
   {
    code = (u16) in_data_buffer[cur_string.start_pos];
    cnt2++;
   }

   DBG_PRINT(("byte offset=%d, ", cur_string.start_pos));
   DBG_PRINT(("code=%d, string length=%d\n", code, cur_string.str_len));

   output_code(code, out_data_buffer, bit_offset);

   cur_string.str_len++;
   addto_string_table(in_data_buffer, string_num, string_table,
    st_entries, &cur_string);

   cur_string.start_pos = cur_pos;
   cur_string.str_len = 1;

   if( cur_pos >= in_data_len )
   {
    break;
   }
  }

  assert(bit_offset == (u32)(cnt1+cnt2)*CODE_LENGTH);
  cur_pos++;
 }

 *out_data_len = bit_offset / CODE_LENGTH;
 ret_val = RCOK_DATA_COM;

err_out:
cprs_fail:

 if( tmp_ptr1 )
 {
  delete []tmp_ptr1;
 }

 if( tmp_ptr2 )
 {
  delete []tmp_ptr2;
 }

 return ret_val;
}

#endif

int search_translation_table(tt_entry_t *tt_entries, u16 code)
{
 if( code<256 || tt_entries[code-256].the_string.str_len>0 )
 {
  return 1;
 }
 else
 {
  return -1;
 }
}

void translate_code(tt_entry_t *tt_entries, u16 code,
 translated_string_t &cur_str)
{
 if( code<256 )
 {
  cur_str.the_string.start_pos = 0;
  cur_str.the_string.str_len = 0;
  cur_str.character = (int)code;
 }
 else
 {
  cur_str.the_string = tt_entries[code-256].the_string;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲综合一区二区三区| 国产精品久久久久天堂| 色综合视频一区二区三区高清| 九九国产精品视频| 美女任你摸久久| 免费看欧美女人艹b| 久久av中文字幕片| 经典三级视频一区| 国产成人午夜99999| 国产大陆精品国产| 国产成人精品免费视频网站| 成人激情动漫在线观看| 白白色亚洲国产精品| 国产91在线|亚洲| 91在线观看一区二区| 日本精品一级二级| 制服丝袜日韩国产| 久久久影院官网| 亚洲婷婷综合久久一本伊一区 | 久久国产三级精品| 国内精品伊人久久久久av影院 | 国产精品天美传媒沈樵| 国产精品女同互慰在线看| 亚洲欧美日韩国产综合| 亚洲成人动漫av| 激情丁香综合五月| 99视频一区二区| 91.xcao| 国产婷婷色一区二区三区四区 | 色欧美88888久久久久久影院| 91成人免费电影| 精品少妇一区二区| 亚洲日本护士毛茸茸| 日韩国产成人精品| 大胆亚洲人体视频| 欧美三区在线观看| 国产三级精品三级在线专区| 亚洲欧美日韩国产成人精品影院| 日韩精品一级二级| 99麻豆久久久国产精品免费优播| 欧美日韩五月天| 日本一区免费视频| 免费久久99精品国产| 色综合久久综合网97色综合 | 中文子幕无线码一区tr| 夜夜精品视频一区二区| 久久精品99国产精品日本| www.成人在线| 精品国产一二三| 日韩国产精品久久| 91免费国产在线观看| 久久精品亚洲精品国产欧美| 亚洲综合清纯丝袜自拍| 春色校园综合激情亚洲| 日韩视频在线你懂得| 亚洲自拍偷拍av| 99热99精品| 国产欧美日韩激情| 麻豆中文一区二区| 欧美疯狂做受xxxx富婆| 亚洲天堂精品视频| 成人av小说网| 国产日产精品1区| 精品一区二区三区不卡 | 国产成人亚洲综合a∨婷婷| 欧美高清激情brazzers| 亚洲国产日韩精品| 在线免费观看成人短视频| 久久众筹精品私拍模特| 国产高清无密码一区二区三区| 日韩一级成人av| 青青青伊人色综合久久| 欧美日韩精品系列| 日欧美一区二区| 欧美日韩中文另类| 视频一区国产视频| 91麻豆精品国产91久久久| 亚洲一区二区成人在线观看| 欧美制服丝袜第一页| 亚洲高清视频中文字幕| 欧美日韩国产欧美日美国产精品| 亚洲一级片在线观看| 欧美日韩精品一区二区三区四区| 天天综合天天综合色| 欧美一区二区免费| 精品一区二区三区在线观看国产 | 国产91精品一区二区麻豆亚洲| 精品av久久707| 国产成人午夜精品影院观看视频| 日本一区二区成人| 99精品欧美一区二区三区小说| 国产精品久久久久久久久晋中| 99re这里只有精品视频首页| 亚洲精品成人a在线观看| 欧美日韩精品一区二区三区| 美脚の诱脚舐め脚责91| 国产色婷婷亚洲99精品小说| av中文字幕在线不卡| 亚洲综合在线视频| 日韩欧美一区二区三区在线| 国产麻豆成人精品| 亚洲欧美日韩久久精品| 日韩一区二区三区精品视频| 国产一区二区看久久| 国产精品成人免费在线| 欧美日韩的一区二区| 韩国成人在线视频| 一区二区三区日本| 精品精品欲导航| hitomi一区二区三区精品| 亚洲国产乱码最新视频| 精品国产91亚洲一区二区三区婷婷| 国产一区二区三区电影在线观看 | 日韩中文字幕91| 国产欧美在线观看一区| 欧美在线影院一区二区| 国产九色sp调教91| 亚洲国产欧美日韩另类综合 | 国产亚洲精久久久久久| 欧美在线制服丝袜| 国产成人免费视频一区| 日韩一区精品视频| **欧美大码日韩| 久久久噜噜噜久噜久久综合| 欧美日韩免费不卡视频一区二区三区| 国产盗摄视频一区二区三区| 婷婷丁香激情综合| 亚洲欧美另类久久久精品| 精品不卡在线视频| 欧美片在线播放| 91免费观看在线| 成人激情免费视频| 国产精品456| 在线观看91视频| 福利电影一区二区| 国产在线播放一区三区四| 丝袜脚交一区二区| 亚洲六月丁香色婷婷综合久久 | 制服丝袜中文字幕亚洲| 91搞黄在线观看| bt欧美亚洲午夜电影天堂| 久久99精品久久久| 美女免费视频一区二区| 奇米在线7777在线精品| 亚洲成人动漫精品| 亚洲一区二区三区美女| 一区二区三区电影在线播| 日本一二三不卡| 中文字幕成人av| 日本一区二区电影| 国产精品高清亚洲| 亚洲视频免费观看| 亚洲天堂久久久久久久| 成人欧美一区二区三区小说| 国产精品国产自产拍高清av王其| 国产欧美精品国产国产专区| 欧美成人午夜电影| 久久亚洲欧美国产精品乐播| 久久一区二区三区国产精品| 久久这里只有精品首页| 国产午夜精品福利| 成人欧美一区二区三区小说 | 欧美极品少妇xxxxⅹ高跟鞋| 精品久久久久久久久久久久包黑料| 日韩写真欧美这视频| 欧美精品一区二区三区四区| 在线成人小视频| 欧美成人官网二区| 日本一区二区三区视频视频| 中文字幕亚洲综合久久菠萝蜜| 亚洲人成网站在线| 五月天一区二区| 极品少妇一区二区三区精品视频| 狠狠色伊人亚洲综合成人| 成人一区二区三区在线观看| 色94色欧美sute亚洲线路一ni| 欧美群妇大交群中文字幕| 精品剧情v国产在线观看在线| 日本一区二区视频在线观看| 夜夜操天天操亚洲| 美女尤物国产一区| 成人av电影免费在线播放| 在线免费不卡电影| 日韩欧美一区中文| 国产精品免费av| 亚洲国产成人av| 韩国v欧美v日本v亚洲v| 色婷婷香蕉在线一区二区| 欧美一区二区三区四区在线观看| 久久综合九色综合97婷婷女人| 国产精品美女久久久久久久久久久 | 福利视频网站一区二区三区| 欧美在线小视频| 久久久久久久久久久久电影| 亚洲国产成人高清精品| 国产99久久久国产精品潘金网站| 欧美怡红院视频| 国产拍揄自揄精品视频麻豆| 视频一区国产视频| 色老综合老女人久久久|