高分求:用LZW的算法对字符串进行压缩/解压的例子?

我不要昵称 2003-08-22 11:37:19
谁有用LZW的算法对字符串进行压缩/解压的例子???
是针对字符串不是文件。并把压缩的字符串用Memo读出来,用clientsocket发送给服务端
...全文
153 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjqyb 2003-08-22
  • 打赏
  • 举报
回复
delphi 安装光盘上就有例子zlib.pas
大地精灵 2003-08-22
  • 打赏
  • 举报
回复
帮你顶吧,不会
IORILI 2003-08-22
  • 打赏
  • 举报
回复
帮你up
IORILI 2003-08-22
  • 打赏
  • 举报
回复
虽然不会,也要站第一楼^_^
crossbow 2003-08-22
  • 打赏
  • 举报
回复
void write_char_to_bs(const unsigned char data, unsigned char *bit_stream,
unsigned long & bit_offset)
{
unsigned long data_buff = data;

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

void write_short_to_bs(const unsigned short data, unsigned char *bit_stream,
unsigned long & bit_offset)
{
unsigned long 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,
unsigned char *bit_stream, unsigned long & bit_offset)
{
int i;
int n;

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

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

bit_offset++ ;
}

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

unsigned char read_char_from_bs(unsigned char *bit_stream, unsigned long & bit_offset)
{
unsigned char data;
read_data_from_bs(& data, 8, bit_stream, bit_offset);

return data;
}

unsigned short read_short_from_bs(unsigned char *bit_stream, unsigned long & bit_offset)
{
unsigned short data;
read_data_from_bs( (unsigned char *) & data, 16, bit_stream, bit_offset);

return data;
}


int search_string_table(unsigned char *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;

unsigned short index = *(unsigned short *) (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 &&
memcmp(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;
}
crossbow 2003-08-22
  • 打赏
  • 举报
回复
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];
tt_entry_t *lzw_translation_table[MAX_STR_NUM];
};

void set_bit(unsigned char *bit_stream, const unsigned long offset_in_bits)
{
unsigned long 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(unsigned char *bit_stream,
const unsigned long offset_in_bits)
{
unsigned long 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(unsigned char *bit_stream, const unsigned long offset_in_bits)
{
unsigned long offset_in_bytes;
unsigned long offset_within_byte;

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

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

void write_data_to_bs(unsigned long *data, int bits_of_data,
unsigned char *bit_stream, unsigned long & bit_offset)
{
int i;
int n;

unsigned long _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);
}
crossbow 2003-08-22
  • 打赏
  • 举报
回复
/*
* Lzw压缩算法
*
* 在我的电脑(赛扬533E)上测试,压缩一个大小为 3,663,344 bytes的文件,
* 耗时大约为9000ms~10000ms,压缩后的文件大小为 1,947,942 bytes。应
* 该说达到实用的程度了吧。
* 附件里有一个介绍Lzw算法的文档(E文写的),有兴趣的可以看看。也许你
* 能写出一个更高效的程序来呢 :)
*/

#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <conio.h>
#include <windows.h>

//#define _DISPLAY_DBGINFO_

#ifdef _DISPLAY_DBGINFO_
int (*dbg_print)(const char *format, ...) = printf;
#else
void dbg_print(const char *format, ...){}
#endif

#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
{
unsigned short str_len;
unsigned short start_pos;
} 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
{
unsigned long code_num : 31;
unsigned long data_compressed : 1;
} lzw_info_t;

#pragma pack()
FrameSniper 2003-08-22
  • 打赏
  • 举报
回复
网络上很多的啊!
tonylk 2003-08-22
  • 打赏
  • 举报
回复
使用zlib
cnssk 2003-08-22
  • 打赏
  • 举报
回复
好多网站上都有,只是需要注册
我不要昵称 2003-08-22
  • 打赏
  • 举报
回复
up
Cipherliu 2003-08-22
  • 打赏
  • 举报
回复
也想学习

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧