Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1602|回复: 0
打印 上一主题 下一主题

内存压缩解压缩库

[复制链接]

1272

主题

2067

帖子

7962

积分

认证用户组

Rank: 5Rank: 5

积分
7962
跳转到指定楼层
楼主
发表于 2019-12-31 12:15:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

  http://download.csdn.net/detail/davayunhuijia/3833445
gzip内存解压压缩(libz.so库)

http://www.devdiv.com/forum.php?mod=viewthread&tid=12982
在内存中解压GZIP流?


Zlib解压缩示例

压缩包的文件结构解析:
zip=unzOpen(resItem->filename);
if(0==zip) return false;

done=unzGoToFirstFile(zip);
while(done==UNZ_OK)
{
unzGetCurrentFileInfo(zip, &file_info, szZipName, sizeof(szZipName), NULL, 0, NULL, 0);
_strupr_s( szZipName, sizeof(szZipName) );
for(int i=0; szZipName; i++) { if(szZipName=='/') szZipName='//'; }
DWORD dwFileNum = 0; DWORD dwFilePos = 0;
unzGetCurrentFileID(zip, &dwFileNum, &dwFilePos);
FilePosInfo *pFPI = new FilePosInfo;
pFPI->dwFileNum = dwFileNum;
pFPI->dwFilePos = dwFilePos;
resItem->mapFilePosInfoPtr.insert( FilePosInfoPtrMap::value_type(std::string(szZipName), pFPI) );

done=unzGoToNextFile(zip);
}

unzClose(zip);

函数功能可以通过函数名了解到。这里只说下:
unzGetCurrentFileInfo(zip, &file_info, szZipName, sizeof(szZipName), NULL, 0, NULL, 0);获取当前文件信息并保存到file_info结构体中。

unzGetCurrentFileID(zip, &dwFileNum, &dwFilePos);得到当前文件在压缩包中的位置信息。第二个参数是该压缩包到这个文件时已有的文件数(可以理解为到文件头的偏移),第三个参数就是文件的位置。可以保存这两个参数,方便以后打开该压缩包后,直接跳转到该文件。

需要注意的是文件夹的相对路径也会作为一个szFileName,与文件类似。即如果有data/user.dat,Zlib会读成两个:data/、data/user.dat。


下面说下压缩包中文件的读取。代码如下:

zip=unzOpen( resItem->filename );
if(0==zip) return 0;
FilePosInfo *pFPI = iter->second;
if(0==pFPI) return 0;
unzGoToFileID(zip, pFPI->dwFileNum, pFPI->dwFilePos);
unzGetCurrentFileInfo(zip, &file_info, szZipName, sizeof(szZipName), NULL, 0, NULL, 0);
if(unzOpenCurrentFilePassword(zip, resItem->password[0] ? resItem->password : 0) != UNZ_OK)
{
unzClose(zip);
sprintf(szZipName, res_err, szZipFile);
_PostError(szZipName);
return 0;
}
void *ptr = malloc(file_info.uncompressed_size);
if(!ptr)
{
unzCloseCurrentFile(zip);
unzClose(zip);
sprintf(szZipName, res_err, szZipFile);
_PostError(szZipName);
return 0;
}
if(unzReadCurrentFile(zip, ptr, file_info.uncompressed_size) < 0)
{
unzCloseCurrentFile(zip);
unzClose(zip);
free(ptr);
sprintf(szZipName, res_err, szZipFile);
_PostError(szZipName);
return 0;
}
unzCloseCurrentFile(zip);
unzClose(zip);
if(dwSize) *dwSize = file_info.uncompressed_size;
return ptr;
-----------------------------------------------------------------

unzGoToFileID(zip, pFPI->dwFileNum, pFPI->dwFilePos);即根据上面提到的文件数(文件偏移)和文件位置,跳转到该文件。
unzOpenCurrentFilePassword(zip, resItem->password[0] ? resItem->password : 0)打开该文件,第二个参数即压缩包密码,没有密码就设为0。

unzReadCurrentFile(zip, ptr, file_info.uncompressed_size)读取文件内容了。


这个是linux的so动态库。无源码,不能用!
这个版本只能解LZM777压缩算法的文件,解不了我们人bsc的话单。
内存压缩解压缩库文件.rar (57.83 KB, 下载次数: 0)


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-11-25 15:48 , Processed in 0.061441 second(s), 22 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表