Zlib解压/压缩实现

Zlib解压/压缩实现

 针对目前2503平台,请参考以下方式实现zlib解压/压缩文件:

1:将plutommi\Customer\ResGenerator\zlib整个文件夹copy到贵司的module文件中。(以browser为例,将整个zlib文件夹copy到plutommi\mmi\BrowserApp路径下)

2:将zlib文件下的source和include文件添加到对应的make文件保证能够正常编译link。(将源文件和头文件添加到make\plutommi\inet_app\inet_app.mak)

3:在贵司模块中添加如下函数实现:
//定义全局变量,客户若选择动态申请内存方式,此过程可略过
#define MAX_ZIP_BUFFER_LENGTH 5*1024
//static unsigned char sbuf[6];//source buffer point
//static unsigned char dbuf[12];//dest buffer point
static unsigned char sbuf[MAX_ZIP_BUFFER_LENGTH];//source buffer point
static unsigned char dbuf[MAX_ZIP_BUFFER_LENGTH];//dest buffer point

static unsigned char usbuf[MAX_ZIP_BUFFER_LENGTH];//source buffer point
static unsigned char udbuf[MAX_ZIP_BUFFER_LENGTH];//dest buffer point

//压缩文件实现

static kal_int32 Compress2file(WCHAR* DestName,const WCHAR* SrcName)
{
FS_HANDLE s_fd;//compressed file handle
FS_HANDLE d_fd;//decompresses file handle
U32 slen = 0;//source length
U32 dlen =0 ;//dest length
U32 read_size,write_size;
U32 ret;

//open source file
s_fd = FS_Open((const WCHAR*)SrcName,FS_READ_WRITE);
if(s_fd<0)
{
kal_prompt_trace(MOD_MMI,"open compress source file fail!");
return -1;
}

//get source file length
FS_GetFileSize(s_fd,&slen);


kal_prompt_trace(MOD_MMI,"sizeof(unsigned char)=%d",sizeof(unsigned char));


//read data to buffer
FS_Read(s_fd,sbuf,slen,&read_size);

kal_prompt_trace(MOD_MMI,"read_size = %d,sbuf = %s",read_size,sbuf);

FS_Close(s_fd);

//compress data
dlen = compressBound(slen); /*get compressed length*/

if(compress(dbuf,&dlen,sbuf,slen)!= Z_OK)
{
kal_prompt_trace(MOD_MMI,"compress fail!");
return -1;
}

//open dest file name
d_fd = FS_Open((const WCHAR*)DestName,FS_READ_WRITE | FS_CREATE_ALWAYS);

if(d_fd<0)
{
kal_prompt_trace(MOD_MMI,"open compress dest file fail!");
return -1;
}

/*save dest buffer data to dest file*/
ret = FS_Write(d_fd,dbuf, dlen, & write_size);
kal_prompt_trace(MOD_MMI,"write_size = %d,dbuf = %s,ret = %d",write_size,dbuf,ret);

FS_Close(d_fd);
return 0;
}

//解压文件实现
static kal_int32 Uncompress_file(WCHAR* DestName,const WCHAR* SrcName)
{
FS_HANDLE s_fd;//uncompressed file handle
FS_HANDLE d_fd;//undecompresses file handle
U32 uslen = 0;//source length
U32 udlen = 0 ;//dest length
U32 read_size,write_size;

//open source file
s_fd = FS_Open((const WCHAR*)SrcName,FS_READ_WRITE);
if(s_fd<0)
{
kal_prompt_trace(MOD_MMI,"open uncompress source file fail!");
return -1;
}

//get source file length
FS_GetFileSize(s_fd,&uslen);

//read data to buffer
FS_Read(s_fd,usbuf,uslen,&read_size);

kal_prompt_trace(MOD_MMI,"read_size = %d,usbuf = %s",read_size,usbuf);

FS_Close(s_fd);

udlen = uslen*2;
if(uncompress(udbuf,&udlen,usbuf,uslen)!= Z_OK)
{
kal_prompt_trace(MOD_MMI,"uncompress fail!");
return -1;
}

//open dest file name
d_fd = FS_Open((const WCHAR*)DestName,FS_READ_WRITE | FS_CREATE_ALWAYS);

if(d_fd<0)
{
kal_prompt_trace(MOD_MMI,"open uncompress dest file fail!");
return -1;
}

/*save dest buffer data to dest file*/
FS_Write(d_fd,udbuf, udlen, & write_size);
kal_prompt_trace(MOD_MMI,"write_size = %d,udbuf = %s",write_size,udbuf);

FS_Close(d_fd);

return 0;
}

//测试demo 

void main()
{
WCHAR SrcName[SRV_FMGR_PATH_MAX_LEN+1] = L"sample.txt";
WCHAR DestName[SRV_FMGR_PATH_MAX_LEN+1] = L"sample.zip";
WCHAR ufileName[SRV_FMGR_PATH_MAX_LEN+1] = L"sample_un.txt";
kal_int32 ret;
kal_int32 result;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/

//ret = compress2zip();

ret = Compress2file((WCHAR*)DestName, (const WCHAR*)SrcName);
if(ret==0)
{
kal_prompt_trace(MOD_MMI,"compress fail!");
}
else
{
kal_prompt_trace(MOD_MMI,"compress success!");
}

result = Uncompress_file((WCHAR *)ufileName,(const WCHAR *)DestName);
}

 

 note:目前zlib只能实现通过函数实现来完成解压/压缩,解压后的文件并不能直接通过PC tool解压,只能通过配套的uncompress去做解压,这个zlib官网的FAQ是有解答的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值