首页
社区
课程
招聘
请问这是什么压缩算法?
2006-1-3 14:02 5813

请问这是什么压缩算法?

2006-1-3 14:02
5813
是头一次看到的,请问这是什么样的压缩算法呢?
void CToHeart2Dlg::Decode(BYTE *dest, BYTE *src, DWORD filesize)
{
        const int DICT_SIZE = 4096;
        const int MAX_LENGTH = 18;
        DWORD restsize        = filesize;
        BYTE dict[DICT_SIZE];
        memset(dict, 0, DICT_SIZE - MAX_LENGTH);
        int pos_dict        = DICT_SIZE - MAX_LENGTH;

        for (LPBYTE pdest = dest;restsize > 0;)
        {
                int flag = *src++;
                for(int mask = 0x0001;mask < 0x0100;mask <<= 1)
                {
                        int data = *src++;
                        if(mask & flag)
                        {        /* flag bit = 1 */
                                *pdest++        = data;
                                dict[pos_dict++]        = data;
                                if(pos_dict == DICT_SIZE)
                                        pos_dict        = 0;
                                if(--restsize <= 0)
                                        break;
                        }
                        else
                        {                                /* flag bit = 0 */
                                int i = *src++;
                                int pos = data | ((i & 0xf0) << 4);                /* position (12 bit) */
                                int len = (i & 0x0f) + 3;                                /* length (4 bit) */

                                for(i = 0;i < len;i++)
                                {
                                        data = dict[(pos + i) & 0x0fff];        /* (DICT_SIZE - 1) */
                                        *pdest++        = data;
                                        dict[pos_dict++]        = data;
                                        if(pos_dict == DICT_SIZE)
                                                pos_dict        = 0;
                                        if(--restsize <= 0)
                                                return;
                                }
                        }
                }
        }
}

[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

收藏
点赞7
打赏
分享
最新回复 (8)
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
datm 2006-1-3 16:28
2
0
Decode 是解码或者解压缩吧
雪    币: 288
活跃值: (415)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
Pr0Zel 7 2006-1-3 17:32
3
0
我也知道它是个压缩算法
雪    币: 343
活跃值: (611)
能力值: ( LV9,RANK:810 )
在线值:
发帖
回帖
粉丝
ForEver 20 2006-1-3 17:41
4
0
基于字典压缩的,看看LZ系列的那几个算法
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
北极星2003 25 2006-1-3 18:40
5
0
不知道叫什么名字,
看起来只是一个简单的解压算法

大致思路如下:
一个源串:source
一个目标串:dest
一个辅助数组:dict

1、逐字节扫描source串,结构为“flag+data”,可以把source串看做若干个这样的结构:
结构为:1).1个flag字节
        2).8个数据(连续的,每一个的数据为1个字节或2个字节,这是由flag位决定)
flag字节的每个位依次对应1个数据。如果flag的第i位为1,那么第i个数据直接写入目标串

2、如果flag的第j位为0,那么这个结构中的第j个数据为两个字节。
例如:假设磁盘的十六进制存储形式为……ABCD……
==》pos = 0XCBA ;len = D + 3 ;
这里的len实际上表示表示的是向目标串dest中写入的字节数。
而这 len 个字节的数据是通过辅助数组dict的
程序中的:dict[(pos + i) & 0x0fff]
显然dict中以pos为起点的连续len个字节就是要写入的数据。
当然,如果到达dict尾时要回到索引0位置。

3、上面两个是重点,当然还有一些操作,比如每次向dest中写入数据的时候,都需要
在dict的对应项中生成一个值。
相信这些构不成难度。
只要搞清楚上面两点就OK 了
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
datm 2006-1-3 19:43
6
0
我不知道这是“压缩算法”,我只是觉得是“解压缩算法”
最初由 Pr0Zel 发布
我也知道它是个压缩算法
雪    币: 214
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zzsx 2006-1-4 02:33
7
0
好像这个算法在Molebox里也见过,不过不清楚叫什么。
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
dwing 1 2006-1-4 08:48
8
0
看起来是一个非常简单的基于LZ算法的解压程序。
字典是4KB,有点像LZRW1算法.
//LZRW1解压程序:
U32 LZRW1::Decompress(U8 *src,U32 srclen,U8 *dst)
{
	U32 ctrl=1; U8 *srcnow=src+1; U8 *dstnow=dst;
	if(*src==LZRW1_FLAG_RAW)
	{
		memcpy(dstnow,src+1,srclen-1);
		dstnow+=srclen-1;
	}
	else
	{
		if(*src!=LZRW1_FLAG_LZRW1) LZRW1_ERROR_BLOCKFLAG;
		while(srcnow<src+srclen)
		{
			if(ctrl==1) ctrl=0x100+*srcnow++;
			if(ctrl&1)
			{
				U32 off=((srcnow[0]&0xF0)<<4)+srcnow[1];
				U32 len= (srcnow[0]&0x0F)+1;  srcnow+=2;
				U8 *p=dstnow-off;
				while(len--) *dstnow++=*p++;
			}
			else
				*dstnow++=*srcnow++;
			ctrl>>=1;
		}
	}
	return dstnow-dst;
}
雪    币: 233
活跃值: (130)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
南蛮妈妈 3 2006-1-4 09:40
9
0
好!学习v
游客
登录 | 注册 方可回帖
返回