kesaan
谁来帮咱写出这个压缩程序?

如下面的:

int NLZSS_11h_uncompress(char *inFileName,char *outFileName)

{

FILE *ifp = fopen(inFileName,"rb");

unsigned char FileID = getc(ifp);

if(FileID != 0x11)

{

fclose(ifp);

return -1;

}

unsigned int outFileSize = 0;

fread(&outFileSize,3,1,ifp);

fseek(ifp,0,2);

unsigned int inFileSize = ftell(ifp)-4;

fseek(ifp,4,0);

unsigned char *inBuffer = new unsigned char[inFileSize];

fread(inBuffer,inFileSize,1,ifp);

fclose(ifp);

unsigned char *outBuffer = new unsigned char[outFileSize];

unsigned char *current_pos = outBuffer;

memset(outBuffer,0,outFileSize);

int backRefLength = 0,

outputLength = 0,

decomp_size = 0,

mask = 0,

count = 0;

int flags = 0,

i = 0;

int r0 = 0,//待解压文件读取指针

r1 = 0,//解压文件写入指针

r2 = 0,//解压大小

r3 = 0,//复制长度

r4 = 0,//LZSS的控制位计数器

r5 = 0,

r6 = 0,

r7 = 0,//作用未知,貌似总是1

r12 = 0,//回溯距离

r14 = 0;//LZSS的ID字节

for( ; ; )

{

if(r4 == 0)

{

flags = inBuffer[r0++];

r4 = 8;

}

if( (flags&0x80) )//解压数据

{

r5 = inBuffer[r0];

if( r5&0xE0 )//r5高三位不全为0

{

r6 = 1;

r3 = r6 + (r5>>4);//复制长度

r0++;

r5 &= 0x0F;

r12 = r5<<8;

r6 = inBuffer[r0++];

r5 = r6 | r12;

r12 = r5 + 1;//回溯距离

}

else//r5高三位全为0

{

r0++;

r6 = r5&0x0F;

r6 <<= 4;

if( r5&0x10 )//第5位不为0

{

r6 <<= 8;

r5 = inBuffer[r0++];

r6 += (r5<<4);

r6 += 0x100;

r6 += 0x11;

r5 = inBuffer[r0];

r3 = r6 + (r5>>4);//复制长度

r0++;

r5 &= 0x0F;

r12 = r5<<8;

r6 = inBuffer[r0++];

r5 = r6 | r12;

r12 = r5 + 1;//回溯距离

}

else

{

r6 += 0x11;

r5 = inBuffer[r0];

r3 = r6 + (r5>>4);//复制长度

r0++;

r5 &= 0x0F;

r12 = r5<<8;

r6 = inBuffer[r0++];

r5 = r6 | r12;

r12 = r5 + 1;//回溯距离

}

}

r1 += r3;

for( ;r3 > 0;r3--)

{

*current_pos++ = outBuffer[current_pos-outBuffer - r12];

}

}

else//直接输出

{

*current_pos++ = inBuffer[r0++];

r1++;

}

if(r1 == outFileSize)

goto END;

flags <<= 1;r4--;

}

END: FILE *ofp = fopen(outFileName,"wb");

fwrite(outBuffer,outFileSize,1,ofp);

_fcloseall();

delete [] inBuffer;

delete [] outBuffer;

return 0;

}

更据上面的东东=。=写出想应的压缩程序,白托咯~~~~~~~~~~~~~~=1012=

kesaan
你的意思是要逆推
展开Biu

ZodiacG 发表于 2012-5-12 11:25

只有uncompress函数……你的意思是要逆推compress函数然后写出程序来么?

for(;;)这种东西……怎么感觉像 ...

只能说是从游戏里拆的

[查看全文]
LoliconLG
我在百度文库看到一个
展开Biu

额。我在百度文库看到一个LZSS压缩算法的实现……我反正已经晕了#16!

PLUS:我下载下来,用notepad++把Tab全部换成4个空格后,编译了一下,过了。然后试着用了一下,也OK,所以就发上来了……

http://wenku.baidu.com/view/e18770d376eeaeaad1f3307f.html

[查看全文]
吃货呐冒个泡
kesaan
搜了下貌似是
展开Biu

轻舟过 发表于 2012-5-12 12:56

搜了下貌似是Lempel–Ziv–Storer–Szymanski压缩算法,应该可以找到实现的源代码吧 ...

咱无力了

[查看全文]
轻舟过
搜了下貌似是
展开Biu

搜了下貌似是Lempel–Ziv–Storer–Szymanski压缩算法,应该可以找到实现的源代码吧

[查看全文]
ZodiacG
你的意思是要逆推
展开Biu

只有uncompress函数……你的意思是要逆推compress函数然后写出程序来么?

for(;;)这种东西……怎么感觉像是从别的某种代码里面机械拆出来的

[查看全文]
kesaan
每太明白什么意思
展开Biu

Flagalac 发表于 2012-5-11 22:13

每太明白什么意思……

就是写出上面解压的程序撒~~~~~~~~~~~~~~~

[查看全文]
Flagalac
每太明白什么意思
展开Biu

每太明白什么意思……

[查看全文]