- UID
- 59588
- 在线时间
- 0 小时
- 最后登录
- 2022-8-31
- 注册时间
- 2012-1-18
- 宅魂
- 2492 点
- 贡献
- 3073 点
- 宅币
- 14633 枚
- 灵石
- 0 块
- 元气(技能点)
- 31 点
- 活跃
- 1 ℃
- 听众
- 22
- 收听
- 7
签到天数: 1 天 连续签到: 1 天 [LV.1]初来乍到
傲娇娘
User your imagination Bitch!
- 积分
- 33328
|
悬赏1000宅币已解决
如下面的:
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;
}
更据上面的东东=。=写出想应的压缩程序,白托咯~~~~~~~~~~~~~~
|
最佳答案
查看完整内容
额。我在百度文库看到一个LZSS压缩算法的实现……我反正已经晕了#16!
PLUS:我下载下来,用notepad++把Tab全部换成4个空格后,编译了一下,过了。然后试着用了一下,也OK,所以就发上来了……
http://wenku.baidu.com/view/e18770d376eeaeaad1f3307f.html
评分
-
查看全部评分
|