Qter 发表于 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 ? 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 ? resItem->password : 0)打开该文件,第二个参数即压缩包密码,没有密码就设为0。

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


这个是linux的so动态库。无源码,不能用!
这个版本只能解LZM777压缩算法的文件,解不了我们人bsc的话单。



页: [1]
查看完整版本: 内存压缩解压缩库